令我沮丧的是,以下代码不会编译.
但是,如果我删除ref关键字,它将编译.
class xyz
{
static void foo(ref object aaa)
{
}
static void bar()
{
string bbb="";
foo(ref bbb);
//foo(ref (object)bbb); also doesnt work
}
}
Run Code Online (Sandbox Code Playgroud)
有谁能解释一下?我猜这与ref对派生类非常严格有关.
有什么办法可以传递string类型的对象foo(ref
object varname)吗?
它必须完全匹配,否则foo可以做到:
aaa = 123;
Run Code Online (Sandbox Code Playgroud)
这将是有效的foo(它将打包int到一个object),但不适用于bar(它是一个string).
两个直接选择; 首先,使用中间变量和类型检查:
object tmp = bbb;
foo(ref tmp);
bbb = (string)tmp;
Run Code Online (Sandbox Code Playgroud)
或者,也许尝试泛型(foo<T>(ref T aaa)); 或者bbb视object而不是string.
不,没有.想象一下:
static void Foo(ref object obj)
{
obj = new SomeObject();
}
static void Bar()
{
string s = "";
Foo(ref s);
}
Run Code Online (Sandbox Code Playgroud)
Foo会尝试将一个SomeObject变量分配给一个实际上是变量的变量string!