Как превратить основанный на дженериках метод в лямбду с помощью Func <...> - PullRequest
0 голосов
/ 16 декабря 2011

Как превратить это

public static List<T> CreateListOfAnonymous<T>(T unused) {return new List<T>();}

в лямду.Я просто не могу понять это.так как универсальный шаблон генерирует ошибку

т.е.:

Func<T,T> ..... fails because its looking for a real type.

Моя цель состоит в том, чтобы использовать логику этого метода, описанного выше, но без метода, просто внутри какого-то метода.

Ответы [ 3 ]

4 голосов
/ 16 декабря 2011

Как превратить универсальный метод в лямбду?

Вы не делаете. Лямбды не могут быть общими. Сожалею! Это одно из различий между именными и анонимными функциями; анонимные функции не могут быть общими, номинальные могут.

Можете ли вы объяснить, какой сценарий требует общих анонимных методов? Если есть действительно веская причина добавить это к языку, мы могли бы рассмотреть это для гипотетической будущей версии.

3 голосов
/ 16 декабря 2011

Моя цель состоит в том, чтобы использовать логику этого метода, описанного выше, но без метода, просто внутри какого-то метода.

Если метод или тип вы используете лямбда-выражения вявляется универсальным (так что у вас есть конкретный тип в контексте), тогда вы можете заставить его работать:

public void SomeMethod<T>()
{
    Func<T, List<T>> createList = CreateListOfAnonymous;
    var list = createList(default(T));
}

// ...

class SomeClass<T>
{
    public void SomeMethod()
    {
        Func<T, List<T>> createList = CreateListOfAnonymous;
        var list = createList(default(T));
    }
}

Если ни один из них не верен для вашего кода, или вы хотите оставить T длялямбда - открытый универсальный тип (возможно, какого-то другого типа, кроме универсальных параметров метода или класса), тогда это будет невозможно, , как упоминал Леппи .

Я нашел вВ тех случаях, когда я хотел сделать что-то подобное в прошлом (до , избегая повторения ), у меня было только несколько типов, к которым я хотел привязаться в методе.Поэтому я просто укусил пулю и создал одну конкретную версию для каждого типа, который хотел поддерживать:

public void SomeMethod()
{
    Func<List<string>> createStringList = () => CreateListOfAnonymous("");
    Func<List<int>> createIntList = () => CreateListOfAnonymous(0);

    var list1 = createStringList();
    var list2 = createStringList();
    var list3 = createStringList();
    var list4 = createIntList();
    var list5 = createIntList();

    // ...
}
0 голосов
/ 16 декабря 2011

Если я вас правильно понимаю, это невозможно.

Вы не можете иметь экземпляры открытых универсальных типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...