Нет никакой разницы между 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), но не работает в некоторых других случаях. В идеале в будущих версиях будет проще понять и мощнее... посмотрим!
person
Jon Skeet
schedule
14.05.2009