Подтвердить что ты не робот

Lambda выражение и ключевое слово var в С#

Возможный дубликат:
С# Почему нельзя назначить анонимный метод для var?

У меня есть следующая инструкция в С#

Func <int, int, int> add = (x, y) => x + y;

Но когда я заменяю оператор левой руки следующим

var add = (x, y) => x + y;

Я получаю ошибку компилятора (Невозможно назначить lambda-выражение для неявно типизированной локальной переменной). Почему?

4b9b3361

Ответ 1

Поскольку компилятор не может понять, какой тип RHS имеет

var add = (x, y) => x + y;

Любой тип, поддерживающий оператор +, является кандидатом, и поскольку тип x и y не является ограничением того же типа. Там было исключено множество возможных операторов +, которые могли бы использоваться, и поэтому набор возможных типов для x и y довольно велик, но для определения типа добавления компилятор должен иметь возможность уменьшить набор до только один тип для x и один для y (не совсем верно, возможно, что и базовый класс, и производный класс будут соответствовать), и все же, даже если компилятор может определить тип для x и y или что вы указали типы чтобы сказать int, вы все равно останетесь с тем, что оба Expression<Func<int,int,int>> и Func<int,int,int> являются возможными типами для добавления

Существует несколько вариантов уменьшения набора возможных типов. Компилятор может попытаться посмотреть, как add будет использоваться позже, но не (и, возможно, не смог бы определить типы, даже если бы это было сделано)

Ответ 2

Ключевое слово var не будет работать, потому что лямбда-выражения используются для обоих делегатов как деревья выражений, а компилятор не знает, для чего он должен преобразовать лямбду. Другими словами, для (x, y) => x + y lambda: Func<int, int, int> и Expression<Func<int, int, int>> допустимы следующие типы.

Ответ 3

Ошибка, которую вы получаете, заключается в том, что компилятор не знает, что такое типы x и y.