2017-08-18 66 views
-6

我們可以用任何其他運營商或功能或除AS以外的其他運營商功能替換IS運營商功能嗎? 我試圖來取代它像這樣我們可以用一些其他運營商替換IS運營商

class test 
{ 
Program a = new Program(); 
ProgramTwo b = new ProgramTwo(); 
if(a.GetType()?. == b.GetType()) 
Console.WriteLine("true"); 
} 

,但不工作的派生類對象與基類檢查的情況下,因此,任何一個請幫助我如何解決這個問題?

+1

你甚至沒有使用'is'關鍵字。 –

+2

你究竟想要做什麼? –

+0

我不想使用IS,但我想執行其功能與其他一些操作 –

回答

0

我不明白你爲什麼不想使用is。這是更美好的方式。如果您使用is,代碼通常會更清晰。

另一種方法是IsAssignableFrom。 (docs

Console.WriteLine(typeof(object).IsAssignableFrom (5.GetType())); 

第二替代是IsInstanceOfType。 (docs

Console.WriteLine(typeof(object).IsInstanceOfType(5)); 

上述兩個類似於

Console.WriteLine(5 is object); 

參見可讀性之間的差異?

0

IsAssignableFrom通常說來模仿is操作(與操作數的相反順序),但運營商有許多細微之處,都難以甚至不可能實現。看看這個代碼:

public static bool TestIs1<T1, T2>() 
{ 
    var arr = new T1[0]; 
    return arr is T2[]; 
} 

Console.WriteLine(TestIs1<int, uint>()); 
var arr = new int[0]; 
Console.WriteLine(arr is uint[]); 

如果你還沒有猜到它,輸出是「真,假」。爲什麼?因爲這個場合是C#明顯不贊同CLR的場合。您可以將int陣列投射到uint陣列,如下所示:(uint[])(object)arr和CLR將允許您這樣做,但如果沒有(object)強制轉換,編譯器會投訴。相比之下,編譯器不能直接影響通用方法中的代碼執行方式,因此CLR會將其執行到isinst操作碼,當然這將允許執行該操作碼。

正如你所看到的,有時候「int[]」是uint[]「有時它不是,而且你不能用另一種方法很容易地重現。如果你要試試這個,你將不得不處理很多類似的情況。例如:Null,Nullables,by-ref-like types(TypedReferenceRuntimeArgumentHandleArgIterator等)。堅持語言爲你提供什麼會更好。