47

オブジェクトが特定のタイプではないかどうかを確認したいと思います。私は何か特定のタイプであるかどうかをチェックする方法を知っています:

if (t is TypeA)
{
   ...
}

しかし

if (t isnt TypeA)
{
   ...
}   

動作しません。

4

7 に答える 7

84

更新2020-10-30:

時代は変わりつつあります。C#9.0以降では、より自然な方法で確認できます。

if(t is not TypeA) { ... }

元の回答:

C#は完全に自然言語ではありません;)これを使用してください

if(!(t is TypeA))
{
   ...
}
于 2012-05-11T10:33:53.547 に答える
10

チェックするだけでなく、演算子として使用することもできます。

var a = t as TypeA;
if(a!= null)
   //use a.. 

このように、チェック後にタイプを使用する場合は、ダブルキャストを回避します。

于 2012-05-11T10:36:57.657 に答える
4

TypeA x = (TypeA)t;ifブロック内で実行している場合は、より良い方法があります

TypeA x = t as TypeA
if(x != null)
{
...
}

これにより、2回ではなく、1回だけタイプチェックが行われます。

于 2012-05-11T10:38:37.580 に答える
4

救助への拡張メソッド!!

public static class ObjectExtensions
{
    public static bool Isnt(this object source, Type targetType)
    {
        return source.GetType() != targetType;
    }
}

使用法

if (t.Isnt(typeof(TypeA)))
{
   ...
}
于 2014-12-18T15:31:24.247 に答える
4

簡単な答え:あなたは使用したいかもしれません:

if (t.GetType()==typeof(TypeA))
{
   ...
}
if (t.GetType()!=typeof(TypeA))
{
  ...
}

長い答え:

それで。それが特定のタイプであるかどうかを尋ねていることに注意してください。 isそれが特定のタイプであるかどうかはわかりません-それが特定のタイプであるか、そのタイプの子孫であるかを示します。

つまり、AnimalとCat:Animalの2つのクラスがあり、felixが猫である場合、

if (felix is Animal)
{
    //returns true
}
if (felix.GetType() == typeof(Animal))
{
    //does not
}

それがあなたにとって重要でないなら、継承されたクラスは大丈夫です、そしてそれについて心配しないでください、!(felix is Animal)他の人が述べたように使ってください、そしてあなたは大丈夫です!(おそらく大丈夫です。)

ただし、felixが具体的に動物であることを確認する必要がある場合は、を尋ねる必要がありますt.GetType()==typeof(TypeA)

于 2018-08-11T22:39:40.893 に答える
2

私は通常、nullとタイプチェックをすべて1行で貼り付けます。

if (t == null || !(t is TypeA)) {
  ...
}

TypeAが構造体の場合は、少し異なる方法で処理する必要があります。

if (t == null || t.GetType() != typeof(TypeA)) {
  ...
}
于 2012-05-11T10:59:04.467 に答える
0

以下の例を確認してくださいgetType()

object obj = new object();
obj.GetType();

string s;
s.GetType();

List<string> StringList = new List<string>();
StringList.GetType();
于 2014-02-27T08:26:25.670 に答える