Это лямбда-выражение:
x => 24
В соответствии с Лямбда-выражениями MSDN лямбда-выражение можно использовать для создания делегата или тип дерева выражений .
A Func<T, int>
- это функция-делегат, которая принимает T в качестве входных данных и возвращает int в качестве выходных.Если вы назначите лямбда-выражение выше для этого Func, то компилятор предполагает, что x
в лямбда-выражении является входом Func, а часть после =>
является выходом Func:
Func<string, int> func = x => x.Length;
Здесь x, как ожидается, будет строкой, часть после =>
может использовать, но не обязана использовать, этот x для получения вывода, который должен быть целым числом.
Func<int, int> func = x => x = -x;
Здесь ожидается, что x будет int.Функция возвращает -x, который также является целым числом.
Expression
- базовый класс всех видов выражений.Выражения представляют операцию, которая возвращает значение.Основными выражениями являются константы, они представляют собой просто постоянное значение, например 24
.Другие выражения могут быть дополнениями, которые принимают в качестве входных данных два выражения и имеют одно выходное значение.Другими выражениями являются умножение, отрицание и т. Д., Которые возвращают «число», или логические выражения, такие как AND OR NOR и т. Д., Которые возвращают логическое значение.
Специальный вид выражения (таким образом, производный класс) - LambdaExpression
.LambdaExpression
обычно представляет объект, подобный функции: он имеет ноль или более входных параметров и один выходной параметр.Вы присваиваете значение LambdaExpression
, используя лямбда-выражение (обратите внимание на пробел в лямбда-выражении!):
Expression<Func<string, int>> myExpression = x => x.Length;
Я писал ранее, что делает лямбда-выражение x => x.Length
.Приведенное выше утверждение создает объект типа System.Linq.Expressions.Expression<TDelegate>
, который имеет тип LambdaExpression , поэтому вы можете назначить его на Expression<Func<string, int>>
.
Ваш вопрос:
Какой минимальный класс E для компиляции E e = x => 24
?
Вашему классу E понадобится конструктор (или оператор присваивания), который принимает System.Linq.Expressions.Expression<Func<MyClass, int>
в качестве параметра.Если вы не используете x
из своего лямбда-выражения, MyClass
может быть object
Конечно, это также допустимо, если конструктор принимает какой-либо из базовых классов, например Expression
.Однако, если вы сделаете это, вы не сможете использовать любую из функций Expression<Func<MyClass, int>
.
О вашем коде Mock
Очевидно, у вас есть класс Aс двумя функциями Foo и Bar, и вы хотите создать экземпляр объекта Mock для имитации функциональности A.
var myAmock = new Mock<A>();
myAmock.Setup(x => x.Foo()).Returns(24);
Это говорит о том, что myAmock
является объектом, который должен имитировать поведение класса A
,Всякий раз, когда кто-то вызывает функцию Foo
, он должен возвращать значение 24.