ref对象参数的方法

时间:2010-02-19 10:24:22

标签: c# asp.net

您好我必须调用具有此签名的方法:

int MethodName(ref object vIndexKey)

如果我尝试用

调用它
String c = "690";

MethodName(ref (object) c);

它不起作用。

我该怎么办?

感谢

3 个答案:

答案 0 :(得分:10)

你需要这样做:

String c = "690"; 
object o = (object) c;
MethodName(ref o);

原因是该参数必须由该函数分配。该函数可以执行以下操作:

o = new List<int>();

如果基础类型是在方法调用期间已转换为对象的字符串,那么这是不可能的,因为赋值的目标仍然是字符串而不是对象。

答案 1 :(得分:2)

当方法具有ref参数时,参数类型必须与参数类型完全匹配。假设MethodName实现如下:

public void MethodName(ref object x)
{
    x = new object();
}

如果只能使用ref c来调用它,您会发生什么?它会尝试将普通System.Object的引用写入System.String类型的变量,从而打破类型安全。

因此,您需要一个object类型的变量。您可以按照klausbyskov的回答中的说明执行此操作,但请注意,值不会然后被复制回原始变量。您可以使用强制转换执行此操作,但请注意它可能会失败:

string c = "690";
object o = c;
MethodName(ref o);
// This will fail if `MethodName` has set the parameter value to a non-null
// non-string reference
c = (string) o;

以下是C#3.0规范的相关内容,第10.6.1.2节(强调我的):

  

当形式参数是参考时   参数,对应的参数   在方法调用中必须包含   关键字ref后跟a   变量引用(第5.3.3节)的   与形式参数相同的类型。一个   变量必须明确赋值   之前它可以作为参考传递   参数。

答案 2 :(得分:-1)

MethodName(ref c);

不起作用?