2011-10-03 38 views
9

変数が参照型の値型であるかどうかを確認する方法はありますか?ジェネリックメソッドパラメータが値型であるかどうかを確認するにはどうすればよいですか?

想像:

private object GetSomething<T>(params T[] values) 
{ 
    foreach (var value in values) 
    { 
     bool is ValueType; // Check if 'value' is a value type or reference type 
    } 
} 
+3

あなたの質問はあいまいです。特定の変数*に値型が含まれているのか、*には一般的な構造によって特定の値型のみが含まれているのかを知りたいですか?変数はオブジェクト型で、ボックス化されたintを含みます。内容は値型ですが、変数はintを含むだけに限定されません。どちらを気にしますか、なぜですか? –

答えて

15
bool isValueType = typeof(T).IsValueType; 

仕事のようになります...の値のいずれかがnullであれば、それは問題ではありませんし、それも動作します空の配列の場合

+6

警告:病理学的な辺のケースを提供したい場合は、 'T'を' object'とし、値をboxed構造体にします。 –

+0

この場合のメソッドパラメータの型は、クラス型のSystem.Objectであり、基底のオブジェクトがボックス化されたstruct *の場合でも、T型の*変数は参照セマンティクスを持ちます。たとえば、 'T'が' IEnumerator 'に束縛されたジェネリックであり、' x'と 'y'が' T'型の変数であるとします。 'T 'がstruct型の場合、' x = y'は列挙子の状態をコピーします。 'T'が参照型の場合、*そのオブジェクトがboxed構造体*であっても、' x'は 'y'の状態を共有します。 – supercat

0

あなたの条件が行わ

var cond = false; 
if(value != null) 
    cond = value.GetType().IsValueType 
+3

実際には、 'value'はref-typeとvalue-typeの両方で' null'になることがあります(後者は 'Nullable 'を介して) –

+0

で再生します。 'value'はnullになる可能性があります:-) – xanatos

+1

私は、評判のポイントのための狩猟が私のコーダーの脳を引き継いだのを見ます。 –

関連する問題