2014-09-03 32 views
1

我想知道在C#.NET中是否有任何類型約束,指出一個類型參數不等於另一個類型參數;這樣的事情...類類型參數的約束要說類型不能相等嗎?

public class FooBar<TA,TB> where TA notequalto TB 

我想這樣做的原因是,這樣我可以創建2個加法運算按以下...

public class FooBar<TA,TB> where TA notequalto TB 
{ 
    public static TA operator +(TB b, FooBar<TA,TB> fooBar) 
    { 
     return fooBar.Foo(b); 
    } 

    public static TB operator +(TA a, FooBar<TA,TB> fooBar) 
    { 
     return fooBar.Bar(a); 
    } 

    public TA Foo(TB b) { ... } 

    public TB Bar(TA a) { ... } 
} 

我所面臨的問題是,如果TA = TB,應該調用哪個運算符,因此應該調用Foo()還是Bar(),這將是不明確的。雖然這不是必需的,但我希望能夠實現這一點,如果可能的話...

回答

2

不,在C#中沒有這樣的約束 - 我不會期望未來有一個,因爲它是使用相當有限。 (根據我的經驗,這不是經常出現的情況。)

0

看起來「不自然」,你的班級不能因爲TA = TB而被使用。

對我來說,自然的是,除了你的類定義類的 「同類型」 版本:

公共類FooBar的< T> {

public static T operator +(T b, FooBar<T> fooBar) 
{ 
    return fooBar.Foo(b); 
} 

public T Foo(T b) { ... } 

}

當TA = TB時(以與某些類的非通用版本類似的方式)使用。

+0

問題是,有問題的類是一個編解碼器,它包含一個Encode方法和Decode方法,其中提供的2個類型參數是編解碼器使用的類型;換句話說,我們將TA編碼爲TB,或者我們將TB解碼爲TA。我希望實現一個運營商,以便我們可以說「TA = TB +編解碼器」(其將TB解碼爲TA)或「TB = TA +編解碼器」(其將TA編碼爲TB)。當然,提供TA = TB將會「破壞」班級。 – 2014-09-04 11:27:00

+0

我還應該補充說,這個類將成爲其他開發者將使用的庫的一部分,所以我不能確保他們不會使用「TA = TB」。 – 2014-09-04 11:29:57

+1

@ Lee.J.Baxter:在運行時執行這些約束非常容易。不知道,但這和文件應該讓事情變得非常清楚。所有這些都說了,我發現想要使用'TA = TB + Codec '而不是'TA = Codec .Decode(TB)'令人難以置信的混淆;'如果你想能夠連接編碼/解碼,我會(Codec + Codec = Codec '或'Codec .Add(Codec ).Decode(TC)',如果你想要更流暢的東西 – Brian 2014-09-04 15:14:10