[英]C# 'is' operator Clarification
is
運算符是否指示 object 是否是某個 class 的實例,或者僅當它可以轉換為該 class 時?
假設我有一個名為command
的DbCommand
實際上已被初始化為SqlCommand
。 command is OracleCommand
?
( SqlCommand
和OracleCommand
都繼承自DbCommand
)
它檢查 object 是否是該類型的成員,或者是從基類型或接口繼承或實現的類型。 在某種程度上,它確實檢查了 object 是否可以轉換為所述類型。
command is OracleCommand
返回 false 因為它是SqlCommand
,而不是OracleCommand
。 但是,兩個command is SqlCommand
並且command is DbCommand
將返回 true,因為它是這兩種類型的成員,因此可以分別向下轉換或向上轉換。
如果您有 inheritance 的三個級別,例如BaseClass
、 SubClass
和SubSubClass
,則初始化為new SubClass()
的 object 僅對is BaseClass
和is SubClass
返回 true 。 盡管SubSubClass
派生自這兩者,但 object 本身並不是它的實例,因此is SubSubClass
返回 false。
如果提供的表達式不為空,則
is
表達式的計算結果為 true,並且可以將提供的 object 強制轉換為提供的類型,而不會引發異常。
來自MSDN :
如果 [...]表達式可以轉換為類型,則 is 表達式的計算結果為 true
http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.80%29.aspx
如果提供的表達式不為空,則 is 表達式的計算結果為 true,並且可以將提供的 object 強制轉換為提供的類型,而不會引發異常。
指示 object is
可以轉換為 class 或接口。
如果你有一個 BaseClass 和一個 SubClass 然后:
var obj = new SubClass();
obj is SubClass
返回 true;
obj is BaseClass
也返回 true;
if(something is X)檢查某事物的基礎類型是否為X 。 這與檢查一個類型是否支持轉換為X明顯不同,因為許多類型可以支持轉換為X而不是X類型。
相反,如果源類型不在目標類型的 inheritance 鏈中,則as運算符嘗試轉換為特定類型並分配null 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.