我怎么能写一个通用的匿名方法?我怎么能写一个通用的匿名方法?(How can I write a g

2019-05-12 10:58发布

具体而言,我想这样写:

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

但我得到一个语法错误T 。 我不能有一个通用的匿名方法?

Answer 1:

不,谢谢。 这就需要通用字段或通用性,这是不是C#支持的功能。 你能做的最好的是使该引入T A泛型方法:

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

现在,你可以说:

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


Answer 2:

当然,你可以,但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



Answer 3:

你只能声明返回类型为通用。

试试这个:

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作为返回参数,只有当它是在方法名宣布第一。

虽然它看起来像返回类型的实际方法之前声明,编译器不读这种方式。



Answer 4:

    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}");
    }


文章来源: How can I write a generic anonymous method?