Первая причина, которая приходит на ум, состоит в следующем.
class Example : Y<int,int> {
...
}
В этом случае тип Y реализует один и тот же интерфейс дважды, но может иметь разные реализации того же метода. Это создает неразрешимую двусмысленность в компиляторе для метода Tx как для реализации, так и для вызова.
Например, выполните следующую задачу.
class OtherExample<A,B> : Y<A,B> {
B Tx(A x) {
Console.WriteLine("Top method in the file");
return default(B);
}
A Tx(B x) {
Console.WriteLine("Bottom method in the file");
return default(A);
}
}
Если вы игнорируете ошибку объединительного это юридическое оформление Y<A,B>
. Теперь представьте себе, что пользователь сделал следующее:
var v1 = new OtherExample<int,int>();
v1.Tx(42);
Что именно произойдет в этом сценарии? Как мог компилятор или CLR решить эту двусмысленность? У вас были бы идентично названные методы с идентичными сигнатурами.
Простая ошибка времени компиляции. –
- Философия заключается в том, что если вы создаете нечувствительный экземпляр, вы просили об этом, но это лучше, чем отказ от полезного шаблона. То есть: не выбрасывайте инструмент только потому, что его можно злоупотреблять: злоупотребление можно статически проверять и отклонять. –