2013-07-31 24 views
0

我正在嘗試設置XmlAttributeXmlElement所允許的類型泛型類型,但是當我設置兩個他們的編譯過程中,我得到一個錯誤的同時:爲什麼我不能將XmlAttribute和XmlElement設置爲通用約束?

類類型約束'System.Xml.XmlElement' 必須出現在任何 其它約束的代碼

實施例:

interface TestClass<T, T2> : IEnumerable where T2: XmlAttribute, XmlElement 
{ 
    ...   
} 

爲什麼它不允許我設置這樣的約束?

+0

你不能做多重繼承! –

回答

3

您使用的約束條件是而不是表示允許的類型的列表。這意味着「爲T2插入的任何內容都必須從中繼承」。

這樣編譯器就可以確保爲T2插入的任何內容都提供了某種公共接口 - 屬性和方法 - 即從指定類型繼承的那些接口。如果您可以列出多個替代方案,那麼將哪個界面視爲理所當然?根據將要插入的內容,T2可能具有XmlAttribute提供的所有方法和屬性,但由XmlElement提供的所有方法和屬性,但都不是肯定的。

+0

我明白了。我誤解了這些限制的概念。感謝您的解釋。 – Nelrum

0

記住XmlAttributeXmlElement之間的逗號表示,不XmlAttributeXmlElement是類,並且由於C#沒有多重繼承,所以任何泛型參數都不可能滿足約束條件。

0

你不能這樣做的原因是因爲這兩種類型有不同的成員。考慮在一種方法上使用它,身體內會發生什麼?你將如何能夠在不知道哪種類型被傳入的情況下編寫一個方法?自動完成如何對這種約束做出反應?

最好的選擇是選擇通用基類System.Xml.XmlNode,或者可能創建兩個單獨的界面,一個與XmlAttribute,另一個與XmlElement

例如:

public interface ICommonInterface<T> : IEnumerable 
{ 
    //common things that rely only on the first type go here 
} 

public interface IAttributeInterface<T, T2> : ICommonInterface<T> 
    where T2 : XmlAttribute 
{ 
} 

public interface IElementInterface<T, T2> : ICommonInterface<T> 
    where T2 : XmlElement 
{ 
} 

如果接口的主要目標是什麼,在大多數情況下使用這兩種類型一起,那麼應該使用XmlNode約束或包裝類的ala適配器/外觀模式被。

1

當你列出了由逗號分隔的多個約束,你告訴C#是T必須滿足所有 *這些限制,而不是一個或另一個。你不能約束說T必須是兩個類之一。通過限制類型參數,可以增加對約束類型支持的操作和方法調用的數量,以及您列爲類型約束的所有接口。這就是首先要實現基於類和基於接口的約束的目的 - 讓您調用超出System.Object類所支持的操作。因此,你從來沒有把兩個類放在約束列表中(當然,你可以放一個類和儘可能多的接口)。即使這兩個類是相關的,將大多數派生出來的約束放在約束中也相當於把它們都放進去。

相關問題