爲什麼在C#中不允許這樣做? alt text http://img706.imageshack.us/img706/7360/restriction.png類型參數統一
其實我希望能寫
alias Y<A, B> : X<A, B>, X<B, A>
的統一實際上是期望在這裏;如果A = B,那麼應該定義一種方法。
爲什麼在C#中不允許這樣做? alt text http://img706.imageshack.us/img706/7360/restriction.png類型參數統一
其實我希望能寫
alias Y<A, B> : X<A, B>, X<B, A>
的統一實際上是期望在這裏;如果A = B,那麼應該定義一種方法。
相反,你可以定義你的類型爲:
public interface Y<A> : X<A,A>
{
}
想到的是下面的第一個原因。
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如何能夠解決模糊問題?您將擁有具有相同簽名的同名命名方法。
一個簡單的編譯時錯誤會做。 – 2010-03-12 06:39:55
- 哲學是如果你做了一個非感性的實例化,你問它,但這比禁止一個有用的模式要好。那就是:不要因爲可以被濫用而丟棄該工具:濫用可以被靜態檢查並被拒絕。 – 2010-03-12 06:57:42