Почему явные вызовы интерфейса C# внутри общего метода, который имеет ограничение типа интерфейса, всегда вызывают базовую реализацию?Почему явные вызовы интерфейса для генериков всегда вызывают базовую реализацию?
Например, рассмотрим следующий код:
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
Там, кажется, нет никакого способа (сокра отражения), чтобы вызвать скрытые, более производные реализации явного интерфейса типа решил во время выполнения.
EDIT: Для того, чтобы быть ясно, следующее, если проверка оценивается как истина в вызове GenericMethod выше:
, если (TypeOf (Т) == TypeOf (IDerived))
Таким образом, ответ не в том, что T всегда рассматривается как IBase из-за ограничения общего типа «где T: class, IBase».
Зачем ему в первую очередь называть 'IDerived.Method'? Кроме того, одно и то же имя 'IBase.Method' и' IDerived.Method' не связаны. – PetSerAl
Ваш 'GenericMethod' указывает' IBase'? – mxmissile
Явная реализация интерфейса * требуется * здесь, поскольку метод() неоднозначен, их два. Если вам нравится второй результат лучше, просто улучшите свой дизайн. Либо удалить IBase из IDerived, либо удалить Method() из IDerived, поскольку IBase уже требует его реализации. И * single * Method() в классе реализует оба интерфейса без двусмысленности. –