2011-08-12 16 views
3

クラス(または構造体)に制限されていないジェネリック型パラメータを持つ場所がいくつかあります。その型の変数をnullと比較しようとすると、Resharperは値を比較していると不平を示しますnull(有効な異論は、必ず入力してください)と入力します。 nullと比較する前に変数が値型であるかどうかを確認する方法はありますか?例えば変数がC#の値型であるかどうかテストする必要がありますか?

public TObject MyProperty { get; set; } 

... 
private void SomeMethod() 
{ 
    if(MyProperty == null) //Warning here 
    { 
     ... 
    } 
} 

私はその有効な--is if(!(MyProperty is ValueType) && MyProperty)を行ってきましたか?それは警告を取り除くわけではありませんが、必ずしも何かを意味するものではありません。

+1

ところで、 "C#.NET"のようなものはありません。言語の名前は "C#"です。 –

+2

値の型をnullと比較するために_ wanting_すると、深刻な問題が発生します。 –

+0

この場合、チェックは必要ありません。MyPropertyが値型の場合、等価はfalseを返します。コンパイラはMyPropertyをNullable に最初に変換するコードを記述します。それでも、あなたのタイピングに苛立っていることを示唆しているので、警告は有効です。 –

答えて

6

値型の場合はどうしますか?時々私が行います。

public void DoStuff<T> (T variable) 
{ 
    if(variable == default(T)) 
     ... // true if null or 0 in the case of a value type 
} 

または:

if(typeof(T).IsValueType) 

hereを参照してください。

+0

私は 'default(T)'のやり方が好きです。 –

+0

オブジェクトが値型の場合、比較結果がfalseになるようにしたい(基本的には、オブジェクトが参照型でnullの場合、いくつかの特定のロジックを実行したいが、コードの残りの部分はお手入れ)。コンパイラがすでにそれを世話しているように思えます。私はそのような状況をどのように扱ったのかよく分かりませんでした。 –

2

あなたはリフレクションを使用することができますが、それは遅いですし、避けるべきである。

bool isValueType = typeof(TObject).IsValueType; 

はあなたの一般的な方法は本当に、その型パラメータとして両方の参照と値の型を渡す必要がありますか?

+0

あなたがそこに持っていた小さな「typo」:) – leppie

+0

私はそれが 'typeof(TObject)'か 'MyProperty.GetType()'のどちらかであるべきだと思います。 – stakx

+0

@leppie:固定感謝、あなたは両方とも正しいです – BrokenGlass

1

あなただけのタイプを比較することができます:

if (MyProperty.GetType() == typeof(...)) 
{ 

} 

MyPropertyが割り当てられていないので、あなたが警告を取得しています。

+0

'MyProperty.GetType()'がnullの場合、NullReferenceExceptionをスローします。 –

0
public static bool IsNull<T>(T t) 
{ 
    return ((Object)t == null); 
} 
関連する問題