2010-05-28 37 views
4

比如我有C#4.0:如何找出是否類型共variantly等於

interface ICommand {} 
class MovePiece : ICommand {} 
class Successful<CMD> where CMD : ICommand {} 

,我想以下幾點:

CovariantlyEqual(
    typeof(Successful<ICommand>), 
    typeof(Successful<MovePiece>)) 
.ShouldEqualTrue() 

更新 埃裏克問之下,爲什麼我想測試這樣的事情。很公平。我認爲有很多場合容易檢查這種「平等」是有用的。以一個簡單的事件聚合器爲例 - 你希望能夠告訴它你有興趣訂閱所有成功的命令。與此同時,另一個組件可能只對一個成功的MovePiece事件感興趣。

我想我錯了,但我認爲這是co和contra的差異。也許平等在這裏是一個錯誤的術語,但顯然在類型定義Successful<MovePiece>Successful<ICommmand>之間存在着某種關係,在語言中是否沒有任何內容容易公開它?

+0

什麼?這怎麼可能得到一個投票呢? – 2010-05-28 03:24:22

+0

我其實是第一個問題......但是我可以看到有人可能會把它解釋爲'[plzsendtehcodez]',因爲你沒有解釋你到目前爲止所做的嘗試。也許是這樣嗎?但我個人認爲,你提出這個問題的方式並不能證明你自己的方法。 – 2010-05-28 03:27:54

+0

你能解釋爲什麼你認爲這兩件事「相等」?他們不平等。它們也不兼容。你能提供一個你稱之爲「協變平等」的關係的精確定義嗎?它實際上是一個等價關係嗎?如果它不是一個等價關係,那麼你爲什麼稱它爲「平等」? – 2010-05-28 04:45:19

回答

4

首先,即便這樣的方法確實存在,你的情況應該不等於真正的原因有兩個:(事實上,如果你這樣做Success<ICommand> c = new Success<MovePiece>()它甚至不會編譯。)

  1. 只有通用代表或通用接口可以標記爲變體,而不是類
  2. 您需要用inout參數明確標記它。

話雖如此,這裏有一個小的修改:

interface ICommand { } 
class MovePiece : ICommand { } 
interface ISuccessful<out CMD> where CMD : ICommand { } 
class Implementation<CMD> : ISuccessful<CMD> where CMD : ICommand { } 

一旦你在的地方,你可以使用TypeIsAssignableFrom()方法:

bool b = typeof(ISuccessful<ICommand>).IsAssignableFrom(typeof(Implementation<MovePiece>)); 
Console.WriteLine(b); 

這將輸出true

+0

有趣...從來沒有聽說過通用參數 – 2010-05-28 14:09:53

+0

進出通用參數在C#4.0中是新的。 – BFree 2010-05-28 14:28:25

相關問題