C # общий вывод типа делегата - PullRequest
3 голосов
/ 17 февраля 2012

Почему компилятор C # не может выводить T в int в указанном примере?

void Main()
{
    int a = 0;
    Parse("1", x => a = x);
    // Compiler error:
    // Cannot convert expression type 'int' to return type 'T'
}

public void Parse<T>(string x, Func<T, T> setter)
{
    var parsed = ....
    setter(parsed);
}

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

Вывод типа метода для лямбды требует, чтобы типы параметров лямбда были уже известны, прежде чем типы возвращаемых значений будут выведены. Так, например, если у вас было:

void M<A, B, C>(A a, Func<A, B> f1, Func<B, C> f2) { }

и звонок

M(1, a=>a.ToString(), b=>b.Length);

тогда мы сделаем вывод:

A is int, from the first argument
Therefore the second parameter is Func<int, B>. 
Therefore the second argument is (int a)=>a.ToString();
Therefore B is string.
Therefore the third parameter is Func<string, C>
Therefore the third argument is (string b)=>b.Length
Therefore C is int.
And we're done.

Понимаете, нам нужно, чтобы А вычислил В, а В - чтобы выработать С. В вашем случае вы хотите вычислить Т из ... Т. И вы не можете этого сделать.

2 голосов
/ 17 февраля 2012

См. http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx раздел об общих методах.

Обратите внимание, что компилятор не может вывести тип на основе типа только возвращаемое значение.

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