Выполненный метод не тот, который я ожидал, хотя ограничение типа дает компилятору достаточно информации, чтобы выбрать правильную перегруженную сигнатуру метода
Без универсального метода он вызывает void DoSomething(IInterface obj)
, как я и ожидал.С универсальным методом вместо этого вызывается void DoSomething<T>(T obj)
, так как он по некоторым причинам считается лучшим кандидатом в этом случае.
interface IInterface
{
void Method();
}
class A : IInterface
{
public void Method()
{
}
}
public class Program
{
static void Gen<T>(T obj) where T : IInterface
{
DoSomething(obj);
}
static void DoSomething<T>(T obj)
{
Console.WriteLine("IN GENERIC DO SOMETHING");
}
static void DoSomething(IInterface obj)
{
Console.WriteLine("IN INTERFACE DOSOMETHING");
}
static void DoSomething(object obj)
{
Console.WriteLine("IN OBJ DO SOMRTHING");
}
public static void Main()
{
IInterface i = new A();
Gen(i);
}
}
Я ожидаю, что неуниверсальный метод DoSomething будет вызываться во всех случаях какКомпилятор имеет конкретный тип для работы из-за ограничений.Вместо этого вызывается универсальный DoSomething.Только когда я удаляю универсальную версию, выбирается неуниверсальный метод.