2010-07-08 89 views
5

我跑在下面:uniquess的方法和約束

public void AddConfig<T>(Config c) where T : BaseTypeA 
{ 
// do stuff 
} 

public void AddConfig<T>(Config c) where T : BaseTypeB 
{ 
// do stuff 
} 

我希望能夠做到這一點。但我認爲這是不可能的。 編譯器忽略約束。爲什麼? (我知道這是設計)。

我想我的2個選項是:

  1. 製作2種不同的功能。
  2. 使2個不同的配置類。

對不對?

+1

當你有沒有按通用的方法在方法簽名的其他地方不使用泛型類型,其他方法在您的方法設計中是錯誤的。 – 2010-07-08 01:45:51

回答

4

如果你的意思是在同一個類,那麼你是正確的(我不認爲編譯器檢查,以確保BaseTypeA和BaseTypeB不能相互轉換,這是你需要檢查,以確保它們是獨特的方法,如類似where T : BaseTypeA && T !: BaseTypeB,如果你明白我的意思)。

話雖如此,雖然,你爲什麼不這樣做這樣的事情:

interface IConfigurable 
{ 
     void AddConfig(Config c) 
} 

public class BaseTypeA : IConfigurable 

public class BaseTypeB : IConfigurable 
+1

好的角度。沒有想到這一點。 – Jeroen 2010-07-08 00:51:08

4

約束不是簽名的一部分。這是設計。

如果你想從人們閱讀百餘評論誰認爲限制應該是簽名的一部分,檢查出的意見,我巧妙地名爲博客條目Constraints Are Not Part Of The Signature.

+0

好的一塊。但我從來沒有碰到過。 – Jeroen 2010-07-08 13:41:38