5

重複の可能性:
型チェック: typeof、GetType、または is?

だから私はコントロールのタイプを比較していて、私はこのようなことができると思った.

if (control[0].GetType() is TSendForReview)

ただし、次の警告が表示されます。

The given expression is never of the provided ('MyApp.Controls.TSendForReview') type    

したがって、これに切り替えると、警告は消えます。

if (control[0].GetType() == typeof(TSendForReview))

その警告の正確な意味と、コントロールの型を比較す​​る際の typeof と is の違いは何ですか。

4

2 に答える 2

8

GetTypeは のインスタンスを返しますがSystem.Type、これは のインスタンスではありませんTSendForReview。あなたはおそらく使いたい

if(control[0] is TSendForReview)

コントロールがタイプのインスタンスであるかどうかを確認します。

変更されたバージョンは、コントロールのランタイム タイプを取得し、それを のタイプ インスタンスと比較しますTSendForReview。これは is を使用するのと同じではありません。なぜなら、それは正確な型を持たなければならないからisですTSendForReview

そして、なぜ警告?

is キーワードは、式が常に true または常に false であることがわかっている場合、コンパイル時に警告を発生させますが、通常は実行時に型の互換性を評価します。

出典: MSDN

于 2012-07-19T20:47:17.427 に答える
0

IS 演算子は、特定の型を実装するすべてのオブジェクトに対して true を返します。GetType 関数は、オブジェクトの型インスタンスを返します。したがって、シナリオに応じて、型チェックを実行する方法が決まります。

次のコードを取る

public interface IFoo { }
public class Foo : IFoo { }
public class FooDerived : Foo { }

次に、具体的な実装がないため、IFoo はインターフェイスであるため (抽象クラスにも同じことが適用されます)、次のチェックは常に false になります。これは、コンパイラが怒鳴っているものかもしれません。

obj.GetType() == typeof(IFoo)

チェックが次の場合、Foo と FooDerived の両方が true になり、それ以外は false になります。

obj is IFoo

オブジェクトが特定の型であり、その型を実装するオブジェクトではないことを確認したい場合は、次のようなチェックを実行する必要があります。これは Foo には当てはまりますが、FooDerived には当てはまりません。

obj.GetType() == typeof(Foo)
于 2012-07-19T21:06:01.460 に答える