2010-10-14 3 views
2

Мои две версии следующих деклараций работают нормально.Делегат работает без создания экземпляра

1) Func<int,int,int> findMax=Max; 
    Console.WriteLine("Max={0}",findMax(10,20)); 

2)Func<int,int,int> findMax=new Func<int,int,int>(Max); 
    Console.WriteLine("Max={0}",findMax(10,20)); 

где

public static T Max<T>(T a, T b) where T:IComparable 
{ 
      if (a.CompareTo(b) > 0) return a; 
      else return b; 
} 

В листинге 2, я конкретизированных делегаты, но в листинге 1 я сделал not.How делает код отлично работает для листинга 1 без создания экземпляра делегата Func?

ответ

2

Это новая функция в C# 2; компилятор будет неявно создавать экземпляр делегата.

Это чистый синтаксический сахар; скомпилированный IL идентичен.

4

Нет, в обоих случаях вы создали экземпляр делегата. Это просто, что в первой версии он скрыт группой методов преобразования. Первая форма - синтаксический сахар для второго.

В основном Max - группа методов, и группа методов может быть преобразована в любой совместимый тип делегата.

+0

Противоположный. Я предполагаю, что Джон означал, что первый - синтаксический сахар для второго :), иначе это место. –

+0

@ Øyvind: Исправлено, спасибо :) –

Смежные вопросы