通过'ref'传递 - c#

时间:2011-06-16 12:20:35

标签: 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
    }
}
  1. 任何人都可以解释一下吗?我正在猜测 它与ref有关 派生非常严格 类。

  2. 我有什么方法可以通过     字符串类型的对象为foo(ref object varname)

4 个答案:

答案 0 :(得分:8)

必须完全匹配,否则foo可以执行:

aaa = 123;

foo有效(它会将int添加到object),但不会barstring 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
}