<p>C’est l’operateur de coalescence nulle, et assez similaire a l’operateur ternaire (if immediat). Voir aussi <a href="https://learn.microsoft.com/en-in/dotnet/csharp/language-reference/operators/null-coalescing-operator">Operateur ?? - MSDN</a>.</p>
<pre><code class="lang-auto">FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
</code></pre>
<p>se developpe en :</p>
<pre><code class="lang-auto">FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();
</code></pre>
<p>qui se developpe davantage en :</p>
<pre><code class="lang-auto">if(formsAuth != null)
FormsAuth = formsAuth;
else
FormsAuth = new FormsAuthenticationWrapper();
</code></pre>
<p>En francais, cela signifie “Si ce qui est a gauche n’est pas null, utilisez cela, sinon utilisez ce qui est a droite.”</p>
<p>Notez que vous pouvez en enchainer autant que vous le souhaitez. L’instruction suivante affectera la premiere <code>Answer#</code> non nulle a <code>Answer</code> (si toutes les reponses sont nulles, alors <code>Answer</code> est null) :</p>
<pre><code class="lang-auto">string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;
</code></pre>
<p>Il convient egalement de mentionner que si le developpement ci-dessus est conceptuellement equivalent, le resultat de chaque expression n’est evalue qu’une seule fois. C’est important si, par exemple, une expression est un appel de methode avec des effets de bord. (Merci a <span class="mention">@Joey</span> pour l’avoir souligne.)</p>