How can I write a generic anonymous method?

﹥>﹥吖頭↗ 提交于 2019-11-26 22:18:34

问题


Specifically, I want to write this:

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

But I get a syntax error at T. Can't I have a generic anonymous method?


回答1:


Nope, sorry. That would require generic fields or generic properties, which are not features that C# supports. The best you can do is make a generic method that introduces T:

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

And now you can say:

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



回答2:


Of course you can, but T must be known:

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

As an alternative you could use a generic method if you don't want to make the containing class generic:

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

But still someone at compile time will need to know this T.




回答3:


You declared only the return type as generic.

Try this:

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

The name of the thing you are declaring must include the type parameters for it to be a generic. The compiler supports only generic classes, and generic methods.

So, for a generic class you must have

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

Or, for methods

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

You can use T as the return parameter, only if it was declared in the method name first.

Even though it looks like the return type is declared before the actual method, the compiler doesn't read it that way.




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


来源:https://stackoverflow.com/questions/4338920/how-can-i-write-a-generic-anonymous-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!