|
2013/12/11(Wed) 10:28:33 編集(投稿者)
■No69239 (魔界の仮面弁士) に追記 > プリミティブ型かどうかなら、IsPrimitive プロパティです。 > # ちなみに、DateTime 型は VB では組み込み型ですが、 > # VB で GetType(Date).IsPrimitive と書いても False を返します。
同様の差異が C# にもありました。IsPrimitive プロパティの場合、 たとえば UIntPtr がプリミティブ型として扱われてしまいますが、 これは C# にとってのプリミティブ型ではありませんよね。
以下は、すべて True と出力されるようです。
Console.WriteLine("Int32:" + typeof(Int32).IsPrimitive); Console.WriteLine("Int64:" + typeof(Int64).IsPrimitive); Console.WriteLine("IntPtr:" + typeof(IntPtr).IsPrimitive); Console.WriteLine("UInt32:" + typeof(UInt32).IsPrimitive); Console.WriteLine("UInt64:" + typeof(UInt64).IsPrimitive); Console.WriteLine("UIntPtr:" + typeof(UIntPtr).IsPrimitive);
一方、以下は、すべて False です。 利用頻度が高そうな decimal 構造体が False な点に注意。
Console.WriteLine("Decimal:" + typeof(decimal).IsPrimitive); Console.WriteLine("String:" + typeof(string).IsPrimitive); Console.WriteLine("Object:" + typeof(object).IsPrimitive); Console.WriteLine("Int32[]:" + typeof(int[]).IsPrimitive); Console.WriteLine("Int32[,]:" + typeof(int[,]).IsPrimitive); Console.WriteLine("Int32[][]:" + typeof(int[][]).IsPrimitive); Console.WriteLine("Byte*:" + typeof(byte*).IsPrimitive); Console.WriteLine("Int32*:" + typeof(int*).IsPrimitive); Console.WriteLine("Int32**:" + typeof(int**).IsPrimitive); Console.WriteLine("Void:" + typeof(void).IsPrimitive); Console.WriteLine("Void*:" + typeof(void*).IsPrimitive); Console.WriteLine("Void**:" + typeof(void**).IsPrimitive);
■No69240 (DD. さん) に返信 > 「他の値型」はプリミティブ型を指していました。 > が、IsPrimitiveも見落としてましたorz
もしも「言語コンパイラにとってのプリミティブ型」の意味で用いるのであれば、 IsPrimitive プロパティは使えないと思います。たとえば、 DateTimeOffset をプリミティブ型として持つ言語系を用いていたとしても、 IsPrimitive は、処理系を問わず False を返してくるように思えます。
もし、VB にとってのプリミティブ型、C# にとってのプリミティブ型といった 意味で判定したいなら、型の一覧を保有しておき、それと比較したほうが良さそうです。
ということで、今回目的としている「プリミティブ型」が、どの範囲の定義を 指しているのか、あらためて考えておいた方が良いかもしれません。ちなみに Entity Framework の PrimitiveType クラスでは、 ・.NET Framework のプリミティブ型 ・概念モデルのプリミティブ型 ・ストレージ プロバイダー固有のプリミティブ型 といった表現が使われていました。
|