关于C#ref关键词一个问题,VS提示参数1不应使用关键字ref传递,我想知道修改使a,b的值都进行引用传递

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C#ref关键词一个问题,VS提示参数1不应使用关键字ref传递,我想知道修改使a,b的值都进行引用传递相关的知识,希望对你有一定的参考价值。

代码为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1

class Program

public static void swap(int x, int y)

int temp;
temp = x;
x = y;
y = temp;
Console.WriteLine("x=0y=1",x,y);

static void Main(string[] args)

int a, b;
a = 4;
b = 5;
Console.WriteLine("调用前:a=0b=1", a, b);//值的传递与C语言等同是单向的。

swap(ref a,ref b);
Console.WriteLine("调用后:a=0b=1", a, b);


public static void swap(ref int x, ref int y)追问

不好意思这个方法可行

追答

你不试试怎么知道可行?

参考技术A swap方法里的两个参数加上ref。追问

由于您晚一点回答,所以就不选你的了。

C# C++/CLR 处理 ref 参数和字符串指针

【中文标题】C# C++/CLR 处理 ref 参数和字符串指针【英文标题】:C# C++/CLR handling ref parameters and string pointers 【发布时间】:2018-02-27 12:51:11 【问题描述】:

我正在为我的 C# 应用程序使用 C++/CLR DLL,并且一直在努力将 byRef 参数传递给本机方法,因为本机代码带有“&”,但 C# 提示我需要删除“ref”(或“out”)关键字。 此外,参数在我的 C# 和字符串中转换为“”,例如无法接受该类型,因此我收到从“字符串”到“字符串”的转换错误

我在这个演示中使用 Pavel Yosifovich 示例代码:

托管 C++ 文件:ManagedPerson.cpp

String^ ManagedPerson::SayHello(String^ &greet) 

marshal_context ctx;
return gcnew String(m_pNative->SayHello(ctx.marshal_as<LPCTSTR>(greet)));

我的 C# 应用:Main.cs

static void Main(string[] args)
    
        var person = new ManagedPerson("Bart", 10);

        Console.WriteLine(person.SayHello("Hello "));
    

然后我在 C# 编译中遇到此错误(由 person.SayHello 引起):

Argument 1: cannot convert from 'string' to 'string*'

如果我从 C++ 代码 (String^ &greet) 中删除“&”,这将有效,但我必须通过引用发送它。

我已经成功地使用 IntPtr 来使用像 Int32 这样的类型(尽管作为不安全的代码),但问题在于字符串和其他复杂类型。

任何线索都会有所帮助。谢谢。

【问题讨论】:

这个答案可能有帮助吗? link 您试图在错误的位置处理互操作。 C++\CLR 和 C# 使用相同的语言,所以在 C++\CLR 方法中去掉“&”。非托管的SayHello 成员函数是什么样的? 谢谢。 SayHello 在示例中如下所示: CString NativePerson::SayHello(LPCTSTR greet) return greet + m_Name;在我的应用程序中,我使用 std::wstring 而不是 CString 和 LPCTSTR 当从 String^ ManagedPerson::SayHello(String^ &greet) 中删除“&”时它有效,但我没有得到对我发送的值的引用... 好吧,样本无关紧要。 编辑您的问题以包含 NativePerson 类定义和 ManagedPerson 类的其余部分。没有足够的信息来说明这里发生了什么。 【参考方案1】:

好的,这样就解决了:

当我在 C++ 代码中的字符串引用参数类似于 Foo(String^ MyStr) 时,我的 CLR 期望它为字符串*。

我必须像 String^% 一样调用它才能在常规 Foo(ref string MyStr) 中调用它

但是,MANAGED 类不会将值传递给 ref 参数,所以我不得不使用临时参数,即:

Void Foo(String^ %MyStr) 
     
marshal_context ctx;
    std::wstring temp_MyStr = ctx.marshal_as<std::wstring>(MyStr);
    myCppClass->DoSomthing(temp_MyStr);
    MyStr = temp_MyStr.c_str();
        

这也指其他类型,例如 int%、short% 等。

对于问题中的示例,解决方案只是将“&”替换为“%”。

String^ ManagedPerson::SayHello(String^ %greet) 

希望这会有所帮助...

【讨论】:

以上是关于关于C#ref关键词一个问题,VS提示参数1不应使用关键字ref传递,我想知道修改使a,b的值都进行引用传递的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ref参数调用方法时删除ref关键字限制?

C# vs Python 参数传递

ref、val 和 out 对方法参数的含义是啥?

关于pytorch在windows上编辑的问题集合

VS2008+Qt+助手 智能提示不显示Qt关键字不高亮的解决办法已解决

c#传递引用对象作为参数的时候就没有必要用ref关键字,对吗