【问题标题】:Passing by 'ref' - c#传递'ref' - c#
【发布时间】:2011-06-16 12:20:34
【问题描述】:

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

如果我删除 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. 谁能解释一下?我正在猜测 它与裁判有关 对派生非常严格 类。

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

【问题讨论】:

  • 注意;如果你只是传递字符串in,你不需要ref这里anyway;如果foo重新分配 aaa,您需要ref > 调用者需要知道重新分配的情况。

标签: c# ref


【解决方案1】:

必须完全匹配,否则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

【讨论】:

    【解决方案2】:

    不,没有。想象一下:

    static void Foo(ref object obj)
    {
        obj = new SomeObject();
    }
    
    static void Bar()
    {
        string s = "";
        Foo(ref s);
    }
    

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      bbb = o as string;
      

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

      static object foo(object aaa) {
      

      用法:

      o = foo(o);
      

      【讨论】:

        【解决方案4】:

        您必须使用完全相同的类型。你可以利用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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多