Ok, c'est peut-être évident pour certains d'entre vous mais je suis perplexe avec le comportement que je suis à partir de ce lieu un code simple:
public static void Main(string[] args)
{
int? n = 1;
int i = 1;
n = ++n - --i;
Console.WriteLine("Without Nullable<int> n = {0}", n); //outputs n = 2
n = 1;
i = 1;
n = ++n - new Nullable<int>(--i);
Console.WriteLine("With Nullable<int> n = {0}", n); //outputs n = 3
Console.ReadKey();
}
Je exepcted les deux sorties à la même et égale à 2
mais, curieusement, ils ne le sont pas. Quelqu'un peut m'expliquer pourquoi?
EDIT: Bien que le code pour générer ce "bizarre" comportement n'est certes artificiel, il ne ressemble à un bug du compilateur C# mais apparemment sans importance et la raison semble être le inline new
comme James l'a souligné au début. Mais le comportement n'est pas limitée aux opérations. Les appels de méthode se comportent exactement de la même manière, en ce qu'ils sont appelés à deux fois quand ils ne doit être appelé qu'une seule fois.
Considérez les points suivants repro:
public static void Main()
{
int? n = 1;
int i = 1;
n = n - new Nullable<int>(sideEffect(ref i));
Console.WriteLine("With Nullable<int> n = {0}", n);
Console.ReadKey();
}
private static int sideEffect(ref int i)
{
Console.WriteLine("sideEffect({0}) called", i);
return --i;
}
Bien sûr, la sortie est 2
alors qu'il devrait être 1
et "sideEffect(i) called"
est imprimé deux fois.