簡體   English   中英

C#'是'運營商澄清

[英]C# 'is' operator Clarification

is運算符是否指示 object 是否是某個 class 的實例,或者僅當它可以轉換為該 class 時?

假設我有一個名為commandDbCommand實際上已被初始化為SqlCommand command is OracleCommand

SqlCommandOracleCommand都繼承自DbCommand

它檢查 object 是否是該類型的成員,或者是從基類型或接口繼承或實現的類型。 在某種程度上,它確實檢查了 object 是否可以轉換為所述類型。

command is OracleCommand返回 false 因為它是SqlCommand ,而不是OracleCommand 但是,兩個command is SqlCommand並且command is DbCommand將返回 true,因為它是這兩種類型的成員,因此可以分別向下轉換或向上轉換。

如果您有 inheritance 的三個級別,例如BaseClassSubClassSubSubClass ,則初始化為new SubClass()的 object 僅對is BaseClassis 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM