С
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
.
Теперь имеет больше смысла?
Вы в основном пытаетесь поставить 'Func' в переменной, напечатанной как 'int'; что-то не так;) –
Sehnsucht
'int x1 = new Func (() => 0)();' будет работать, поскольку вы затем вызываете выражение функции, получаете результат 0, а затем присваиваете это int. Однако это не так важно для возвращаемых значений, и, к сведению, первый работает, потому что вы можете назначить что-либо для var. Третий работает, потому что снова вы вызываете выражение функции (особенно с строкой, как она ожидает). –
@TravisJ мы ничего не можем поместить в 'var'; «только» вещи, тип которых может быть (статически?) разрешен из выражения. например, 'var foo = delegate() {return 0; }; 'не будет работать – Sehnsucht