В частности, я хочу написать это:
public Func<IList<T>, T> SelectElement = list => list.First();
Но я получаю синтаксическую ошибку в T
. Могу ли я использовать общий анонимный метод?
В частности, я хочу написать это:
public Func<IList<T>, T> SelectElement = list => list.First();
Но я получаю синтаксическую ошибку в T
. Могу ли я использовать общий анонимный метод?
Нет, извините. Для этого потребуются общие поля или общие свойства, которые не являются функциями, поддерживаемыми С#. Лучшее, что вы можете сделать, это сделать общий метод, который вводит T:
public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); }
И теперь вы можете сказать:
Func<IList<int>, int> selectInts = SelectionMethod<int>();
Конечно, вы можете, но 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
.
Вы указали только тип возврата как общий.
Попробуйте следующее:
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 как возвращаемый параметр, только если он был сначала объявлен в имени метода.
Несмотря на то, что тип возвращаемого значения объявляется перед фактическим методом, компилятор не читает его таким образом.
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}");
}