J'ai rencontré un certain comportement intéressant dans l'interaction entre l' Nullable
et conversions implicites. J'ai trouvé que la fourniture d'une conversion implicite d'un type de référence à partir d'un type de valeur, il permet à l' Nullable
type à être transmis à une fonction nécessitant le type de référence lorsque j'ai plutôt s'attendre à une erreur de compilation. Le code ci-dessous illustre cela:
static void Main(string[] args)
{
PrintCatAge(new Cat(13));
PrintCatAge(12);
int? cat = null;
PrintCatAge(cat);
}
private static void PrintCatAge(Cat cat)
{
if (cat == null)
System.Console.WriteLine("What cat?");
else
System.Console.WriteLine("The cat's age is {0} years", cat.Age);
}
class Cat
{
public int Age { get; set; }
public Cat(int age)
{
Age = age;
}
public static implicit operator Cat(int i)
{
System.Console.WriteLine("Implicit conversion from " + i);
return new Cat(i);
}
}
Sortie:
The cat's age is 13 years
Implicit conversion from 12
The cat's age is 12 years
What cat?
Si la conversion de code est supprimé à partir d' Cat
, puis vous obtenez des erreurs attendues:
Error 3 The best overloaded method match for 'ConsoleApplication2.Program.PrintCatAge(ConsoleApplication2.Program.Cat)' has some invalid arguments
Error 4 Argument 1: cannot convert from 'int?' to 'ConsoleApplication2.Program.Cat
Si vous ouvrez le fichier exécutable avec ILSpy le code qui a été généré est comme suit
int? num = null;
Program.PrintCatAge(num.HasValue ? num.GetValueOrDefault() : null);
Dans une expérience similaire, je l'ai enlevé de la conversion et de l'ajout d'une surcharge d' PrintCatAge
qui prend un int (et non nullable) pour voir si le compilateur d'effectuer une opération similaire, mais il ne le fait pas.
Je comprends ce qui se passe, mais je ne comprends pas la justification. Ce comportement est inattendu pour moi, et me semble bizarre. Je n'ai pas eu tout le succès ne trouver aucune référence à ce comportement sur MSDN dans la documentation pour les conversions ou Nullable<T>
.
La question que je pose est alors, est-ce intentionnel et s'il y a une explication pourquoi ce qui se passe?