2016-07-06 2 views
0

Почему первое и третье выражения работают, но не второе?Lambda Expression return type issue

 var ss = new Func<int>(() => 0); //works 
     int x1 = new Func<int>(() => 0); //doesn't work --Cannot convert source type 'System.Func<int>' to target type 'int' 
     int x2 = new Func<string,int>((x) => 0)(""); //works 
+5

Вы в основном пытаетесь поставить 'Func ' в переменной, напечатанной как 'int'; что-то не так;) – Sehnsucht

+0

'int x1 = new Func (() => 0)();' будет работать, поскольку вы затем вызываете выражение функции, получаете результат 0, а затем присваиваете это int. Однако это не так важно для возвращаемых значений, и, к сведению, первый работает, потому что вы можете назначить что-либо для var. Третий работает, потому что снова вы вызываете выражение функции (особенно с строкой, как она ожидает). –

+0

@TravisJ мы ничего не можем поместить в 'var'; «только» вещи, тип которых может быть (статически?) разрешен из выражения. например, 'var foo = delegate() {return 0; }; 'не будет работать – Sehnsucht

ответ

8

С

var ss = new Func<int>(() => 0); 

компилятор способен правильно вывести фактический тип ss быть Func<int>. Func<int> - это делегат, который может быть вызван и возвращает int. Итак:

ss() == 0 // is true 

Обратите внимание, что мы должны были вызвать ss здесь (например, ss()) для того, чтобы возвращенияint.

Так, зная, что мы делаем из сказанного выше, следующий не может быть правильным

int x1 = new Func<int>(() => 0); 

, потому что вы теперь пытаетесь сохранить функцию/делегатом (идентичный предыдущему) в переменную, как набранный int. Это делегат типа Func<int> ... очень отличается от int, это то, что возвращает a int при вызове/вызове.

В этом случае

int x2 = new Func<string,int>((x) => 0)(""); 

вы объявляете функцию, которая принимает строку в качестве параметра и возвращает int, то сразу ссылающегося на него (поставки неиспользуемый пустую строку, "" в качестве параметра). Затем функция возвращает int, которую вы затем храните против x2.

Теперь имеет больше смысла?

+0

Да! Это часть вызова, которую я не понимал.Итак, самым чистым методом будет: int x1 = new Func (() => 0)(); Для назначения есть две части - выражение лямбда, а затем вызов, который фактически выполняет func.and возвращает то, что мне нужно вернуть. Большое значение. – Chris

0

Вы пытались добавить тип возвращаемого значения для Func, как это так,

int x1 = new Func<int, int>(() =<0); 

Вы заметите, это также возвращает ту же ошибку.

var работает, потому что значение var не имеет значения для типа. C# строго типизирован так для int, Func ожидает тип значения int.