CLR не поддерживает ковариантные типы возвращаемых данных, в то время как он поддерживает общую дисперсию делегата/интерфейса от .NET 2.0 и далее.
Другими словами, дело не в команде C#, а в команде CLR.
Относительно того, почему CLR не поддерживает нормальную дисперсию - я не уверен, кроме добавления сложности, предположительно без необходимого количества предполагаемой выгоды.
EDIT: Для борьбы с точкой относительно возврата типа ковариации, из раздела 8.10.4 из CLI спецификации, говорить о «виртуальных таблицах слотов»:
Для каждого нового члена, который помечен «ожидать существующий слот ", посмотрите, есть ли точное соответствие по типу (то есть поле или метод ), имя и подпись существует и использовать этот слот, если он найден, в противном случае выделите новый слот.
Из раздела II, раздел 9.9:
В частности, для того, чтобы определить, ли шкуры членов (для статических или членов экземпляра) или переопределения (для виртуальных методов) участник из base , просто замените каждый общий параметр с его общим аргументом и сравните итоговые сигнатуры участников .
Нет указаний, что сравнение проводится таким образом, чтобы это допускало отклонение.
Если вы считаете, что CLR делает, допускайте отклонение, я думаю, что, учитывая приведенные выше доказательства, вам нужно доказать это с помощью соответствующего IL.
EDIT: У меня только пробовал в IL, и он не работает.Компиляция этот код:
using System;
public class Base
{
public virtual object Foo()
{
Console.WriteLine("Base.Foo");
return null;
}
}
public class Derived : Base
{
public override object Foo()
{
Console.WriteLine("Derived.Foo");
return null;
}
}
class Test
{
static void Main()
{
Base b = new Derived();
b.Foo();
}
}
запустить его с выходом:
Derived.Foo
Разобрать его:
ildasm Test.exe /out:Test.il
Редактировать Derived.Foo
иметь тип возвращаемого значения "строка" вместо "объекта" :
.method public hidebysig virtual instance string Foo() cil managed
R Ебилд:
ilasm /OUTPUT:Test.exe Test.il
Rerun это, с выходом:
Base.Foo
Другими словами, Derived.Foo больше не отменяет Base.Foo насколько CLR обеспокоен.
Естественно, эта реализация также потерпит неудачу, потому что get не имеет тела, но для этого простого примера, пожалуйста, проигнорируйте этот факт ;-) –
Dup: http://stackoverflow.com/questions/837134/why-does-c-clr -not-support-method-override-co-contra-variance – thecoop
thecoop, я узнал сам, поэтому я дал свой голос за закрытие этого вопроса. –