令我沮丧的是,以下代码不会编译。
如果我删除ref
关键字,则会编译。
class xyz
{
static void foo(ref object aaa)
{
}
static void bar()
{
string bbb="";
foo(ref bbb);
//foo(ref (object)bbb); also doesnt work
}
}
任何人都可以解释一下吗?我正在猜测 它与ref有关 派生非常严格 类。
我有什么方法可以通过
字符串类型的对象为foo(ref
object varname)
?
答案 0 :(得分:8)
必须完全匹配,否则foo
可以执行:
aaa = 123;
对foo
有效(它会将int
添加到object
),但不会bar
(string
object tmp = bbb;
foo(ref tmp);
bbb = (string)tmp;
)。
两个直接选择;首先,使用中间变量和类型检查:
foo<T>(ref T aaa)
或者,也许尝试泛型(bbb
);或将object
视为string
而不是{{1}}。
答案 1 :(得分:5)
不,没有。想象一下:
static void Foo(ref object obj)
{
obj = new SomeObject();
}
static void Bar()
{
string s = "";
Foo(ref s);
}
Foo会尝试将SomeObject
分配给实际为string
的变量!
答案 2 :(得分:0)
当您通过引用传递变量时,它必须与该类型完全匹配。
您可以通过创建具有正确类型的另一个变量来调用该方法:
string bbb = "";
object o = bbb;
foo(ref o);
如果您希望将更改的值返回到字符串变量中,则必须检查类型并将其强制转换:
bbb = o as string;
考虑使用返回值而不是ref
关键字,只返回更改后的值:
static object foo(object aaa) {
用法:
o = foo(o);
答案 3 :(得分:0)
您必须使用完全相同的类型。您可以利用dynamic
public static void foo(ref object a)
{
a = "foo";
}
static void Main(string[] args)
{
string bbb = "";
dynamic a = bbb; // or object
foo(ref a);
bbb = a; // if it was object you need to cast to string
Console.WriteLine(bbb); // foo
}