2010-03-11 61 views

回答

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

一個簡單的編譯時錯誤會做。 – 2010-03-12 06:39:55

+0

- 哲學是如果你做了一個非感性的實例化,你問它,但這比禁止一個有用的模式要好。那就是:不要因爲可以被濫用而丟棄該工具:濫用可以被靜態檢查並被拒絕。 – 2010-03-12 06:57:42