代码之家  ›  专栏  ›  技术社区  ›  Max Yaffe

行动委托<ref t1,t2>

  •  29
  • Max Yaffe  · 技术社区  · 15 年前

    我正在尝试创建一个静态方法的委托,该方法接受一个引用参数。请不要问我为什么要做这种愚蠢的事。这都是学习.NET、C和反射如何工作以及如何优化它的一部分。

    我的代码是:

        public struct DataRow
        {
    
            private double t;
            static public void Cram_T(ref DataRow dr, double a_t)
            {
                dr.t = a_t;
            }
        }
     ''''
      Type myType = typeof(DataRow);
      MethodInfo my_Cram_T_Method = myType.GetMethod("Cram_T");
      var myCram_T_Delegate = 
             Delegate.CreateDelegate(typeof(Action<DataRow, Double>),      
                                     my_Cram_T_Method) 
                                     as Action<DataRow, Double>;
    

    这会给我一个绑定错误,因为(我认为)通用操作与方法不匹配。

    在监视窗口中检查cram_t_方法的值给出

    {Void Cram_T(DataRow ByRef, Double)}
    

    然后我尝试在操作中使用ref关键字:

      var myCram_T_Delegate = 
             Delegate.CreateDelegate(typeof(Action<ref DataRow, Double>),         
                                     my_Cram_T_Method) 
                                     as Action<ref DataRow, Double>;
    

    但这不会编译。C编译器被标记“ref”阻塞。

    创建此委托的正确方法是什么?

    2 回复  |  直到 15 年前
        1
  •  38
  •   Ben M    15 年前

    创建自己的委托类型:

    delegate void MyAction(ref DataRow dataRow, double doubleValue);
    

    使用 MyAction 代替 Action<ref DataRow, Double> --正如您所指出的,它不能编译。

        2
  •  23
  •   Jon Skeet    15 年前

    @本·M有正确的想法,尽管你可以让它更通用:

    public delegate void RefAction<T1, T2>(ref T1 arg1, T2 arg2)
    

    这个问题与代理没有任何关系——只是你不能使用 ref 当指定类型参数时。

    理论上,“它是由参考或不是”是类型信息的一部分(因此 Type.IsByRef )但你不能这样指定它。

    坦率地说,如果你试图创造一个 List<ref int> 例如,通过思考-我会 希望 一个例外会被抛出…这不是一个很明智的概念:)

    编辑:我刚试过:

    Type refInt = typeof(int).MakeByRefType();
    Type refIntList = typeof(List<>).MakeGenericType(refInt);
    

    引发错误:

    Unhandled Exception: System.ArgumentException: The type 'System.Int32&' may
    not be used as a type argument.