【问题标题】:Create anonymous function using generic type parameters?使用泛型类型参数创建匿名函数?
【发布时间】:2016-01-11 06:53:51
【问题描述】:

假设我有这个方法:

int MyMethod(int arg)
{
    return arg;
}

我可以像这样创建一个匿名的等价物:

Func<int, int> MyAnonMethod = (arg) =>
{
    return arg;
};

但是假设我有一个使用这样的泛型类型参数的方法:

T MyMethod<T>(T arg)
{
    return arg;
}

如何将 that 创建为匿名方法?

【问题讨论】:

    标签: .net generics anonymous-methods


    【解决方案1】:

    你有两个选择:

    1. 您创建一个具体的委托对象,它指定T 的类型
    2. 您在通用上下文中声明委托,使用现有的T

    第一个例子

    var f = new Func<int, int>(MyMethod<int>);
    var result = f(10);
    

    第二个例子

    T Test<T>()
    {
        T arg = default(T);
        Func<T, T> func = MyMethod; // Generic delegate
        return func(arg);
    }
    
    // Define other methods and classes here
    T MyMethod<T>(T arg)
    {
        return arg;
    }
    

    您将无法说服编译器或智能感知在非泛型上下文中将泛型 T 与委托一起传递,然后在调用它时计算出实际的 T

    所以这是不合法的:

    void Test()
    {
        var fn = new Func<T, T>(MyMethod<T>);
        fn(10); // returns 10
        fn("Test"); // returns "Test"
    }
    

    【讨论】:

      【解决方案2】:

      你可以使用

      Func<T, T> MyAnonMethod = (arg) =>
      {
          return arg;
      };
      

      如果你在一个有T 的地方(方法、类)。如果您没有T,您可以创建一个返回 Func 的方法,例如:

      Func<T, T> CreateMyAnonMethod()
      {
          returns (arg) => { return arg; };
      }
      

      【讨论】:

        【解决方案3】:

        所有来自泛型的具体方法都是匿名的。反过来就不行了。

        这样做很简单:

        T MyMethod<T>(T arg)
        {
            return arg;
        }
        
        //...
        
        Func<int, int> MyAnonMethod = MyMethod<int>;
        MyAnonMethod(1); // returns 1
        

        如果直接使用MyMethod,则会隐式使用正确的类型,例如:

        MyMethod(1); // returns 1 of type int
        

        【讨论】:

        • 但这意味着我知道T 我不知道。就像我在具体方法中不知道T一样,在我的匿名方法中我也不知道T
        • 您的意思是在(arg) ... 中您没有指定int那个是你要找的吗?
        • 正确。我需要能够传入任何类型。当我调用匿名方法时,我希望智能感知工具提示显示T MyClass.MyMethod&lt;T&gt;(T arg)。一旦我将表达式完成为int i = MyMethod(1),然后我希望智能感知工具提示显示int MyClass.MyMethod&lt;int&gt;(int arg)
        • 不确定 IntelliSense,但 MyMethod(1) 将接受并返回 int(注意,MyMethod,而不是 MyAnonMethodint 是隐含的)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多