通过'ref'传递 - c#

max*_*axp 4 c# ref

令我沮丧的是,以下代码不会编译.

但是,如果我删除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)
  1. 有谁能解释一下?我猜这与ref对派生类非常严格有关.

  2. 有什么办法可以传递string类型的对象foo(ref object varname)吗?

Mar*_*ell 8

它必须完全匹配,否则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)); 或者bbbobject而不是string.


Sve*_*ven 5

不,没有.想象一下:

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!