Тип Параметр Унификация - PullRequest
4 голосов
/ 12 марта 2010

Почему это запрещено в C #? альтернативный текст http://img706.imageshack.us/img706/7360/restriction.png

На самом деле я бы хотел написать

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

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

Ответы [ 2 ]

6 голосов
/ 12 марта 2010

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

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

2 голосов
/ 12 марта 2010

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

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