如何编写通用的匿名方法?

时间:2010-12-02 19:23:25

标签: c# generics anonymous-function

具体来说,我想写一下:

public Func<IList<T>, T> SelectElement = list => list.First();

但我在T收到语法错误。我不能拥有通用的匿名方法吗?

4 个答案:

答案 0 :(得分:15)

不,抱歉。这将需要通用字段或通用属性,这些属性不是C#支持的功能。你能做的最好的事情是制作引入T:

的通用方法
public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); }

现在你可以说:

Func<IList<int>, int> selectInts = SelectionMethod<int>();

答案 1 :(得分:6)

当然可以,但必须知道T

class Foo<T>
{
    public Func<IList<T>, T> SelectionMethod = list => list.First();
}

作为替代方案,如果您不想使包含类通用,则可以使用泛型方法:

public Func<IList<T>, T> SelectionMethod<T>()
{
    return list => list.First();
}

但是仍然有人在编译时需要知道这个T

答案 2 :(得分:1)

您只将返回类型声明为通用。

试试这个:

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); }

您要声明的内容的名称必须包含类型参数才能成为通用名称。编译器仅支持泛型类和泛型方法。

因此,对于通用类,您必须具有

class MyGeneric<T> { 
   // You can use T here now
   public T MyField;
 }

或者,对于方法

public T MyGenericMethod<T>( /* Parameters */ ) { return T; }

只有首先在方法名称中声明了T才能使用T作为返回参数。

即使它看起来像在实际方法之前声明了返回类型,编译器也不会那样读它。

答案 3 :(得分:-1)

    public static void SomeContainerFunction()
    {
        const string NULL_VALUE = (string)null;

        Type GetValueType<T>(T value) => value?.GetType() ?? typeof(T);

        var typeOfNullValue = GetValueType(NULL_VALUE);

        Debug.WriteLine($"Value: {NULL_VALUE}, Type: {typeOfNullValue}");
    }