5

次の方法がある場合:

static void DoSomethingWithTwoNullables(Nullable<int> a, Nullable<int> b)
{
    Console.WriteLine("Param a is Nullable<int>: " + (a is Nullable<int>));
    Console.WriteLine("Param a is int          : " + (a is int));
    Console.WriteLine("Param b is Nullable<int>: " + (b is Nullable<int>));
    Console.WriteLine("Param b is int          : " + (b is int));
}

null をパラメーターとしてこのメ​​ソッドを呼び出すと、型チェックはこのパラメーターに対して false を返します。たとえば、このコード

DoSomethingWithTwoNullables(5, new Nullable<int>());

次の出力が得られます。

Param a is Nullable<int>: True
Param a is int          : True
Param b is Nullable<int>: False
Param b is int          : False

Nullable を使用して null を渡すときに型情報を保持する方法はありますか? この例で型をチェックしても意味がないことはわかっていますが、問題を示しています。私のプロジェクトでは、params object[]配列を受け取り、オブジェクトの型を識別しようとする別のメソッドにパラメーターを渡します。このメソッドは、 と に対して異なることを行う必要がNullable<int>ありNullable<long>ます。

4

8 に答える 8

5

根本的な問題に直行すると、いいえ、これはできません。nullは、 null 、または実際には「通常の」 nullNullable<int>とまったく同じボックス化された表現を持ちます。Nullable<long>null の基本的な表現はすべてゼロであるため、null の「型」を特定する方法はありません。詳細については、 Null 許容型のボックス化を参照してください。

于 2012-10-15T13:57:39.963 に答える
3

概念的には、new Nullable<int> です null

一般化すると、次のことを忘れてしまいますNullable<T>

string s = null;
bool b = s is string;

私たちは得るfalse。値の型チェックfalse期待null値です。

于 2012-10-15T13:59:54.010 に答える
1

これを実現するには、Reflectionを使用してみてください。関連記事はこちら。

于 2012-10-15T14:01:05.313 に答える
0

質問を誤解しない限り、を使用して型を取得できますGetType()。例えば、

int? myNullableInt = null;
Console.WriteLine(myNullableInt.GetValueOrDefault().GetType());

nullの場合myNullableInt、デフォルト値が返されます。この戻り値のタイプを確認してください。この場合、が返されSystem.Int32ます。If..else返されたタイプに対して/Switchチェックを実行して、関連するアクションを実行できます。

int?と同じですNullable<int>

于 2012-10-15T14:16:50.020 に答える
0

これを行うことはできません。また、行う必要もありません。は構造体であるためNullable<T>、この型の値型変数には、コンパイル時に必要なすべての型情報が含まれています。typeof演算子 を使用するだけです。

一方、コンパイル時にタイプがわからない Nullable インスタンスがある場合もあります。それは、静的型がobjectまたは他の参照型である変数である必要があります。ただし、値はボックス化されたNullable<T>値にボックス化されるため、ボックス化されたものTはありませんNullable<T> チェックするタイプがT.

is intこれが、とで同じ結果が得られる理由ですis Nullable<int>。boxedがないためint、 boxed とboxed を区別する方法はありません。int?int?

詳細については、 Null が失われなくなったを参照してください。

于 2012-10-15T14:21:36.203 に答える
0

残念ながら、null特定のメモリ位置を指していないため、タイプを検索するために関連付けることができるメタデータはありません。したがって、変数に関する追加情報を取得することはできません。

于 2012-10-15T13:58:33.437 に答える
0

typeof を使用できます:

a == typeof(Nullable<int>) //true
a == typeof(int) //false
于 2013-08-27T09:11:21.953 に答える
0

すでに指摘されているようnullに、タイプはありません。何かがint?vsかどうかを判断するにはlong?、リフレクションを使用して、型を格納している何かに関する情報を取得する必要があります。インスピレーションとして使用できる可能性のあるコードを次に示します (コードを達成するために何をしようとしているのか正確にわからないのは少し奇妙です)。

class Pair<T> where T : struct {

  public Pair(T? a, T? b) {
    A = a;
    B = b;
  }

  public T? A { get; private set; }

  public T? B { get; private set; }

}

void DoSomething<T>(Pair<T> pair) where T : struct {
  DoMore(pair);
}

void DoMore(params object[] args) {
  Console.WriteLine("Do more");
  var nullableIntPairs = args.Where(IsNullableIntPair);
  foreach (Pair<int> pair in nullableIntPairs) {
    Console.WriteLine(pair.A);
    Console.WriteLine(pair.B);
  }
}

bool IsNullableIntPair(object arg) {
  var type = arg.GetType();
  return type.IsGenericType
    && type.GetGenericTypeDefinition() == typeof(Pair<>)
    && type.GetGenericArguments()[0] == typeof(int);
}

次のコードを実行すると

DoSomething(new Pair<int>(5, new int?()));
DoSomething(new Pair<long>(new long?(), 6L));

次の出力が得られます。

もっとやる
5
ヌル
もっとやる
于 2012-10-15T14:23:30.907 に答える