2010-12-02 4 views
11

В частности, я хочу, чтобы написать это:Как написать общий анонимный метод?

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

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

+0

решена! http://stackoverflow.com/questions/4338867 – mpen 2010-12-02 20:22:34

ответ

11

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

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

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

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

Конечно, вы можете, но 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.

+0

Да, это проблема. Я не знаю, что такое Т. Это может быть символ или строка. – mpen 2010-12-02 19:25:43

+0

Ну, надеюсь, что потребитель (тот, который его создает) класса `Foo ` будет знать это. Если вы никогда не знаете этого во время компиляции, то дженерики не являются подходящим артефактом для вас. – 2010-12-02 19:26:23

+2

Ну, тогда ваш метод или ваш класс должны взять общий параметр `T`. – cdhowie 2010-12-02 19:26:45

1

Вы указали только тип возврата как общий.

Попробуйте это:

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

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

0
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}"); 
    } 
Смежные вопросы