2016-11-23 2 views
0

Если Действие является делегат, как указано на MDN:Разница между отправкой анонимной функции против Func/Action на другую функцию с параметром Delegate?

общественного делегата недействительными действий()

  • Почему это может быть передан типа, не делегата в качестве делегата?
  • Почему не может быть передана анонимная функция? (Я читал, что лямбда создает анонимный делегат, как если бы функция была создана с делегатом {})

TestA (new Action (delegate { return; })); // Right. 
TestA (delegate { return; }); // Wrong. 
TestB (delegate { return; }); // Right. 
TestB (() => { return; }); // Right. 

public void TestA(Delegate del) { 
    // stuff... 
} 

public void TestB(Action callback) { 
    TestB (callback); 
} 

ответ

2

Все делегаты унаследованы из Delegate, так что вы можете пройти любой делегат метода принимая Delegate.

Почему не может быть передана анонимная функция?

Поскольку у него нет типа делегата. Это анонимный метод, но компилятор не знает, какой делегат должен использовать анонимный метод. (Использование ключевого слова delegate здесь при создании анонимного метода запутанно. Вы фактически не создаете анонимного делегата, вы создаете анонимный метод.)

Выражение не компилируется, потому что компилятор всегда должно быть в состоянии выяснить, каков тип любого выражения, а для анонимных методов (и lambdas) это нужно сделать из контекста. Когда метод является Delegate, он не может определить , который должен быть делегатом, поэтому он терпит неудачу. Когда вы передаете его Action, он знает, какое действие он должен быть, и он совместим, так что успех.

(я читал, что лямбда создает анонимный делегат, как если бы функция была создана с делегатом {})

  1. Это анонимный метод, но не лямбда.
  2. Анонимный метод или лямбда никогда не создает анонимного делегата на C#. Это происходит в VB.NET (возможно, вы слышали это и считали, что это применимо к C#?), Но в C# нет такой вещи, как анонимный делегат.
+0

Большое спасибо! – Ruri