Вывод типа в лямбда-выражениях



При написании лямбда-выражений обычно не требуется указывать тип параметров ввода, поскольку компилятор может вывести этот тип на основе тела лямбда-выражения, лежащего в его основе типа делегата и других факторов, как описано в спецификации языка C# 3.0. Для большинства стандартных операторов запроса первый ввод имеет тип элементов в исходной последовательности. Поэтому, если производится запрос IEnumerable<Customer>, переменная ввода расценивается как объект Customer, а это означает, что у вас есть доступ к его методам и свойствам.

customers.Where(c => c.City == "London");

Используются следующие основные правила для лямбда-выражений.

· Лямбда-выражение должно содержать то же число параметров, что и тип делегата.

· Каждый параметр ввода в лямбда-выражении должен быть неявно преобразуемым в соответствующий параметр делегата.

· Возвращаемое значение лямбда-выражения (если таковое имеется) должно быть неявно преобразуемым в возвращаемый тип делегата.

Обратите внимание: лямбда-выражения сами по себе не имеют типа, поскольку система общих типов не имеет внутреннего принципа "лямбда-выражения". Однако иногда бывает удобно оперировать понятием "типа" лямбда-выражения. При этом под типом понимается тип делегата или тип Expression, в который преобразуется лямбда-выражение.


Variable Scope in Lambda Expressions

Lambdas can refer to outer variables that are in scope in the enclosing method or type in which the lambda is defined. Variables that are captured in this manner are stored for use in the lambda expression even if variables would otherwise go out of scope and be garbage collected. An outer variable must be definitely assigned before it can be consumed in a lambda expression. The following example demonstrates these rules:

delegate bool D(); delegate bool D2(int i); class Test {    D del;    D2 del2;    public void TestMethod(int input)    {        int j = 0;        // Initialize the delegates with lambda expressions.        // Note access to 2 outer variables.        // del will be invoked within this method.        del = () => { j = 10; return j > input; };        // del2 will be invoked after TestMethod goes out of scope.        del2 = (x) => {return x == j; };                    // Demonstrate value of j:        // Output: j = 0        // The delegate has not been invoked yet.        Console.WriteLine("j = {0}", j);           // Invoke the delegate.        bool boolResult = del();        // Output: j = 10 b = True        Console.WriteLine("j = {0}. b = {1}", j, boolResult);    }    static void Main()    {        Test test = new Test();        test.TestMethod(5);        // Prove that del2 still has a copy of        // local variable j from TestMethod.        bool result = test.del2(10);        // Output: True        Console.WriteLine(result);                    Console.ReadKey();    } }

Область действия переменной в лямбда-выражениях

Лямбда-выражения могут ссылаться на внешние переменные, попадающие в область действия включающего их метода или типа, в котором определено это выражение. Переменные, захваченные таким способом, сохраняются для использования в лямбда-выражениях даже в том случае, если эти переменные иначе попадают за границы области действия и уничтожаются сборщиком мусора. Внешняя переменная должна быть определенным образом назначена, прежде чем она сможет использоваться в лямбда-выражениях. В следующем примере показаны эти правила.

ß---


The following rules apply to variable scope in lambda expressions:

· A variable that is captured will not be garbage-collected until the delegate that references it goes out of scope.

· Variables introduced within a lambda expression are not visible in the outer method.

· A lambda expression cannot directly capture a ref or out parameter from an enclosing method.

· A return statement in a lambda expression does not cause the enclosing method to return.

· A lambda expression cannot contain a goto statement, break statement, or continue statement whose target is outside the body or in the body of a contained anonymous function.


Следующие правила применимы к области действия переменной в лямбда-выражениях.

· Захваченная переменная не будет уничтожена сборщиком мусора до тех пор, пока делегат, который на нее ссылается, не выйдет за границы области.

· Переменная, введенная в лямбда-выражение, невидима во внешнем методе.

· Лямбда-выражение не может непосредственно захватывать параметры ref или out из включающего их метода.

· Оператор Return в лямбда-выражении не вызывает возвращение значения методом.

· Лямбда-выражение не может содержать оператор goto, оператор break или оператор continue, целевой объект которого находится вне тела либо в теле содержащейся анонимной функции.

 


Дата добавления: 2019-03-09; просмотров: 244; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!