2011-06-06 56 views
9

是否is操作指示對象是否是某一類的一個實例,或者只在可以鑄造的那類?C#「是」經營者澄清

假設我有一個名爲commandDbCommand,它實際上已被初始化爲SqlCommandcommand is OracleCommand的結果是什麼?

SqlCommandOracleCommand無論從DbCommand繼承)

+0

結果不會是錯誤的,因爲DbCommand和SqlCommand都不是OracleCommand的實例嗎? – 2011-06-06 14:23:24

+0

'is'指示對象是否是該類型的實例或派生自此類型的實例。 http://msdn.microsoft.com/en-us/library/scekt9xw(v=VS.100).aspx – Jon 2011-06-06 14:24:34

+0

@they:這兩個定義不一樣嗎? – Mehrdad 2011-06-06 14:24:45

回答

18

它檢查如果對象是該類型的成員,或從繼承或實現基本類型或接口類型。在某種程度上,它確實檢查對象是否可以轉換爲所述類型。

command is OracleCommand返回false,因爲它是SqlCommand而不是OracleCommand。然而,command is SqlCommandcommand is DbCommand都將返回true,因爲它是這兩種類型的成員,因此可以分別向下或向上轉換爲任一類型。

如果您有三個級別的繼承,例如BaseClass,​​和SubSubClass,初始化爲new SubClass()的對象僅對is BaseClassis SubClass返回true。儘管SubSubClass源自這兩者,但該對象本身不是它的一個實例,因此is SubSubClass將返回false。

1

is指示該對象可以被澆鑄到一個類或接口。

如果你有一個BaseClass的,然後一個子類:

var obj = new SubClass(); 

obj is SubClass返回true;

obj is BaseClass也返回true;

+1

如果你想比較實際的類型,使用'command.GetType()。Equals(typeof(SqlCommand))''。 – Jess 2011-06-06 14:22:58

+0

那些不相關的類型與顯式的轉換操作符在它們之間進行轉換呢? – 2011-06-06 14:25:31

6

is一個表達式評估爲真,如果所提供的表達爲非空,並且所提供的對象可投到所提供的類型而不會導致拋出異常。

Source

4

MSDN:如果

的是表達式的值爲true [...] 表達可以轉換爲鍵入

0

如果(某物是X)檢查的基礎類型的東西X。這與檢查類型是否支持鑄造到X有顯着不同,因爲許多類型可以支持鑄造到X而不是類型X

相反地,作爲操作者試圖轉換到特定類型並且指派如果源類型不是目標類型的繼承鏈內。