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(TypedReference,RuntimeArgumentHandle,ArgIterator等)。堅持語言爲你提供什麼會更好。
你甚至沒有使用'is'關鍵字。 –
你究竟想要做什麼? –
我不想使用IS,但我想執行其功能與其他一些操作 –