4

令我沮丧的是,以下代码无法编译。

ref但是,如果我删除关键字,它将编译。

class xyz
{
    static void foo(ref object aaa)
    {
    }

    static void bar()
    {
        string bbb="";
        foo(ref bbb);
        //foo(ref (object)bbb); also doesnt work
    }
}
  1. 谁能解释一下?我猜这与 ref 对派生类非常严格有关。

  2. 有什么方法可以将字符串类型的对象传递给foo(ref object varname)?

4

4 回答 4

8

它必须是完全匹配的,否则foo可以这样做:

aaa = 123;

这将有效foo(它将框int到 a object),但不适用于bar(它是 a string)。

两个直接的选择;首先,使用中间变量和类型检查:

object tmp = bbb;
foo(ref tmp);
bbb = (string)tmp;

或者,也许尝试泛型(foo<T>(ref T aaa));或bbb视为object代替string.

于 2011-06-16T12:22:51.533 回答
5

不,没有。想象一下:

static void Foo(ref object obj)
{
    obj = new SomeObject();
}

static void Bar()
{
    string s = "";
    Foo(ref s);
}

Foo 会尝试将 a 分配给SomeObject实际上是 a 的变量string

于 2011-06-16T12:23:11.753 回答
0

当您通过引用传递变量时,它必须与类型完全匹配。

您可以通过创建另一个具有正确类型的变量来调用该方法:

string bbb = "";
object o = bbb;
foo(ref o);

如果您希望将更改后的值返回到字符串变量中,则必须检查类型并将其强制转换:

bbb = o as string;

考虑使用返回值而不是ref关键字,并且只返回更改后的值:

static object foo(object aaa) {

用法:

o = foo(o);
于 2011-06-16T12:27:14.857 回答
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
}
于 2011-06-16T12:27:41.490 回答