C#Func(T)不接受ref类型输入参数

时间:2011-03-04 18:48:07

标签: c#-4.0

Func(T)可以接受C#中的引用类型变量。

static void Main()
    {
        Func<string,int, int> method = Work;
        method.BeginInvoke("test",0, Done, method);
        // ...
        //
    }
    static int Work(ref string s,int a) { return s.Length; }
    static void Done(IAsyncResult cookie)
    {
        var target = (Func<string, int>)cookie.AsyncState;
        int result = target.EndInvoke(cookie);
        Console.WriteLine("String length is: " + result);
    }

我无法定义一个可以接受ref类型输入参数的func。有人请指教......

2 个答案:

答案 0 :(得分:5)

Func<T>代表无法获取ref个参数 您需要创建自己的委托类型,该类型需要ref个参数。

但是,您首先不应该使用ref

答案 1 :(得分:3)

扩展SLaks答案。

Func<T>个委托系列是通用的,允许您自定义参数的类型和返回。虽然ref对C#的类型系统有贡献,但它实际上并不是CLR级别的类型:它是一个存储位置修饰符。因此,不可能使用通用实例来控制特定位置是否为ref

如果可能的话,很容易产生完全无效的代码。请考虑以下

T Method<T>() {
  T local = ...;
  ...
  return local;
}

现在考虑如果开发人员调用Method<ref int>()会发生什么。它将生成本地和返回值ref。这将导致无效的C#代码。