2016-05-24 2 views
2

私が達成しようとしていることを実証するテストコードsnippetを作成しました。しかし、期待通りに機能しません(コードのコメントを参照)。オブジェクトパラメータに渡されたときに、(オブジェクト)nullと(10進数)の間で区別する方法は?

public class Program 
{ 
    public static void Main() 
    { 
     object obj = null; 
     decimal? nullDecimal = null; 

     Test(obj);   // Expected: Something else, Actual: Something else 
     Test(nullDecimal); // Expected: Nullable decimal, Actual: Something else 
    } 

    public static void Test(object value) 
    { 
     if (value is decimal) 
     { 
      Console.WriteLine("Decimal"); 
      return; 
     } 

     if (value is decimal?) 
     { 
      Console.WriteLine("Nullable decimal"); 
      return; 
     } 

     Console.WriteLine("Something else"); 
    } 
} 

.NETでも可能ですか?

+0

「ヌル」はオブジェクトが存在しないことであり、型も存在しないこともあります。あなたはそこにない何かのタイプをチェックすることはできません。 – poke

答えて

3

この例では、objectdecimal?かどうかを判断することはできません。どちらの場合も、単にnullの参照が渡されますが、型情報は渡されません。あなたが渡す値がnullであるかどうか、コンパイル時の型が自動的にキャプチャされているかどうか、これにより

public static void Main() 
{ 
    object obj = null; 
    decimal? nullDecimal = null; 

    Test(obj);   // prints Something else 
    Test(nullDecimal); // prints Nullable decimal 
} 

public static void Test<T>(T value) 
{ 
    if (typeof(T) == typeof(decimal)) 
    { 
     Console.WriteLine("Decimal"); 
     return; 
    } 

    if (typeof(T) == typeof(decimal?)) 
    { 
     Console.WriteLine("Nullable decimal"); 
     return; 
    } 

    Console.WriteLine("Something else"); 
} 

:あなたは、ジェネリックを使用して型情報を取り込むことができます。

関連する問題