2012-02-17 3 views
3

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

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); 
} 
+0

Что вы пытаетесь сделать? – gdoron

+1

Я тоже не мог это сделать. Попробуйте 'Parse (...)' –

+0

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

ответ

4

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

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. 

См, нам нужно выработать B и B работать вне C. В вашем случае вы хотите выработать T от T. И вы не можете этого сделать.

+0

действительно кажется очевидным, когда вы так выразились ... :) – m0sa

Смежные вопросы