Нет разницы между MyAction
и new Action(MyAction)
(когда они оба действительны), кроме первого, не будет работать в C # 1. Это implicit method group conversion
. Временами это не применимо, особенно когда компилятор не может определить, какой тип делегата вам нужен, например,
Delegate foo = new Action(MyAction); // Fine
Delegate bar = MyAction; // Nope, can't tell target type
Это входит в игру в вашем вопросе, потому что оба метода перегружены. В основном это приводит к головным болям.
Что касается дженериков - это интересно. Группы методов не получают большой любви от вывода типа C # 3 - я не уверен, будет ли это улучшено в C # 4 или нет. Если вы вызываете универсальный метод и указываете аргумент типа, вывод типа работает довольно хорошо - но если вы попытаетесь сделать это наоборот, он потерпит неудачу:
using System;
class Test
{
static void Main()
{
// Valid - it infers Foo<int>
DoSomething<int>(Foo);
// Valid - both are specified
DoSomething<int>(Foo<int>);
// Invalid - type inference fails
DoSomething(Foo<int>);
// Invalid - mismatched types, basically
DoSomething<int>(Foo<string>);
}
static void Foo<T>(T input)
{
}
static void DoSomething<T>(Action<T> action)
{
Console.WriteLine(typeof(T));
}
}
Вывод типа в C # 3 очень сложен и хорошо работает в большинстве случаев (в частности, он отлично подходит для LINQ), но не работает в некоторых других. В идеальном мире стало бы легче понимать и более мощные в будущих версиях ... посмотрим!