2010-03-11 4 views
4

Почему это запрещено в C#? alt text http://img706.imageshack.us/img706/7360/restriction.pngТип Параметр Унификация

На самом деле я хотел бы, чтобы иметь возможность написать

alias Y<A, B> : X<A, B>, X<B, A> 

Объединение фактически желаемого здесь; если A = B, то должен быть определен только один метод.

ответ

2

Вместо вы могли бы определить свой тип, как:

public interface Y<A> : X<A,A> 
{ 
} 
6

Первая причина, которая приходит на ум, состоит в следующем.

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 решить эту двусмысленность? У вас были бы идентично названные методы с идентичными сигнатурами.

+0

Простая ошибка времени компиляции. –

+0

- Философия заключается в том, что если вы создаете нечувствительный экземпляр, вы просили об этом, но это лучше, чем отказ от полезного шаблона. То есть: не выбрасывайте инструмент только потому, что его можно злоупотреблять: злоупотребление можно статически проверять и отклонять. –

Смежные вопросы