C # Infer универсальный тип на основе передачи делегата - PullRequest
7 голосов
/ 13 сентября 2011

У меня есть следующий код:

public static class X
{
    public static C Test<A,B,C>(this A a, Func<B,C> f)
        where C:class
    {
        return null;
    }

}

public class Bar
{
    public Bar()
    {
        this.Test(foo); //this doesn't compile
        this.Test((Func<int, string>)foo);
        this.Test((int q) => "xxx");
    }

    string foo(int a) { return ""; }
}

Почему отмеченная строка не компилируется? Это как-то связано с тем, что возвращаемый тип не является частью подписи?
Но третья строка компилируется, что заставляет меня догадываться, что компилятор превращает ее во что-то похожее на вторую строку ...

1 Ответ

7 голосов
/ 13 сентября 2011

По сути, процесс вывода типа, описанный в разделе 7.5.2 спецификации, является относительно слабым, когда дело доходит до преобразования группы методов. В аннотированном стандарте, в разделе 7.5.2.6, в котором говорится о выводах типов выходных данных, включая группы методов, есть аннотация от Владимира Решетникова, в которой говорится:

Этот шаг [вывод типа вывода группы методов] применяется, только если все параметры типа метода, встречающиеся в типах параметров делегата, уже фиксированы. Разрешение перегрузки не пытается выбрать лучший метод на основе неполной информации о типе.

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

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