Почему явные вызовы интерфейса С# в универсальном методе, который имеет ограничение типа интерфейса, всегда вызывают базовую реализацию?
Например, рассмотрим следующий код:
public interface IBase
{
string Method();
}
public interface IDerived : IBase
{
new string Method();
}
public class Foo : IDerived
{
string IBase.Method()
{
return "IBase.Method";
}
string IDerived.Method()
{
return "IDerived.Method";
}
}
static class Program
{
static void Main()
{
IDerived foo = new Foo();
Console.WriteLine(foo.Method());
Console.WriteLine(GenericMethod<IDerived>(foo));
}
private static string GenericMethod<T>(object foo) where T : class, IBase
{
return (foo as T).Method();
}
}
Этот код выводит следующее:
IDerived.Method
IBase.Method
Вместо того, что можно было бы ожидать:
IDerived.Method
IDerived.Method
Кажется, что нет пути (не до рефлексии) для вызова скрытой, более производной явной реализации интерфейса типа, определенного во время выполнения.
РЕДАКТИРОВАТЬ: Чтобы быть ясным, следующее, если проверка оценивается как true в вызове GenericMethod выше:
if (typeof (T) == typeof (IDerived))
Итак, ответ не в том, что T всегда рассматривается как IBase из-за ограничения общего типа "где T: class, IBase".