Comment : identifier un type valeur Nullable (guideC# de programmation)How to: identify a nullable value type (C# Programming Guide)

L’exemple suivant montre comment déterminer si une instance System.Type représente un type valeur Nullable générique fermé, autrement dit, le type System.Nullable<T> avec un paramètre de type spécifié T :The following example shows how to determine whether a System.Type instance represents a closed generic nullable value type, that is, the System.Nullable<T> type with a specified type parameter T:

Console.WriteLine($"int? is {(IsNullable(typeof(int?)) ? "nullable" : "non nullable")} type");
Console.WriteLine($"int is {(IsNullable(typeof(int)) ? "nullable" : "non nullable")} type");

bool IsNullable(Type type) => Nullable.GetUnderlyingType(type) != null;

// Output:
// int? is nullable type
// int is non nullable type

Comme l’illustre l’exemple, vous utilisez l’opérateur typeof pour créer un objet System.Type.As the example shows, you use the typeof operator to create a System.Type object.

Si vous souhaitez déterminer si une instance est d’un type de valeur Nullable, n’utilisez pas la méthode Object.GetType pour obtenir une instance Type à tester avec le code précédent.If you want to determine whether an instance is of a nullable value type, don't use the Object.GetType method to get a Type instance to be tested with the preceding code. Quand vous appelez la méthode Object.GetType sur une instance d’un type valeur Nullable, l’instance est convertie en Object.When you call the Object.GetType method on an instance of a nullable value type, the instance is boxed to Object. La conversion boxing d’une instance non null d’un type valeur Nullable équivaut au boxing d’une valeur du type sous-jacent, GetType retourne un objet Type qui représente le type sous-jacent d’un type valeur Nullable :As boxing of a non-null instance of a nullable value type is equivalent to boxing of a value of the underlying type, GetType returns a Type object that represents the underlying type of a nullable value type:

int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32

N’utilisez pas l’opérateur is pour déterminer si une instance est d’un type valeur Nullable.Don't use the is operator to determine whether an instance is of a nullable value type. Comme le montre l’exemple suivant, vous ne pouvez pas distinguer les types d’instances d’un type valeur Nullable et son type sous-jacent à l’aide de l’opérateur is :As the following example shows, you cannot distinguish types of instances of a nullable value type and its underlying type with using the is operator:

int? a = 14;
if (a is int)
{
    Console.WriteLine("int? instance is compatible with int");
}

int b = 17;
if (b is int?)
{
    Console.WriteLine("int instance is compatible with int?");
}
// Output:
// int? instance is compatible with int
// int instance is compatible with int?

Vous pouvez utiliser le code présenté dans l’exemple suivant pour déterminer si une instance est d’un type valeur Nullable :You can use the code presented in the following example to determine whether an instance is of a nullable value type:

int? a = 14;
int b = 17;
if (IsOfNullableType(a) && !IsOfNullableType(b))
{
    Console.WriteLine("int? a is of a nullable type, while int b -- not");
}

bool IsOfNullableType<T>(T o)
{
    var type = typeof(T);
    return Nullable.GetUnderlyingType(type) != null;
}

// Output:
// int? a is of a nullable type, while int b -- not

Voir aussiSee also