В частности, я хочу, чтобы написать это:Как написать общий анонимный метод?
public Func<IList<T>, T> SelectElement = list => list.First();
Но я получаю ошибку синтаксиса в T
. Могу ли я использовать общий анонимный метод?
В частности, я хочу, чтобы написать это:Как написать общий анонимный метод?
public Func<IList<T>, T> SelectElement = list => list.First();
Но я получаю ошибку синтаксиса в T
. Могу ли я использовать общий анонимный метод?
Нет, извините. Для этого потребуются общие поля или общие свойства, которые не являются функциями, поддерживаемыми C#. Лучшее, что вы можете сделать, это универсальный метод, который вводит 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
.
Да, это проблема. Я не знаю, что такое Т. Это может быть символ или строка. – mpen 2010-12-02 19:25:43
Ну, надеюсь, что потребитель (тот, который его создает) класса `Foo
Ну, тогда ваш метод или ваш класс должны взять общий параметр `T`. – cdhowie 2010-12-02 19:26:45
Вы указали только тип возврата как общий.
Попробуйте это:
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}");
}
решена! http://stackoverflow.com/questions/4338867 – mpen 2010-12-02 20:22:34