Подтвердить что ты не робот

Как написать общий анонимный метод?

В частности, я хочу написать это:

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

Но я получаю синтаксическую ошибку в T. Могу ли я использовать общий анонимный метод?

4b9b3361

Ответ 1

Нет, извините. Для этого потребуются общие поля или общие свойства, которые не являются функциями, поддерживаемыми С#. Лучшее, что вы можете сделать, это сделать общий метод, который вводит T:

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

И теперь вы можете сказать:

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

Ответ 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.

Ответ 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 как возвращаемый параметр, только если он был сначала объявлен в имени метода.

Несмотря на то, что тип возвращаемого значения объявляется перед фактическим методом, компилятор не читает его таким образом.

Ответ 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}");
    }