Quelqu'un pourrait-il vous expliquer pourquoi le code présenté ci-dessous est valide en C # et exécute l'appel à console.writeline code>?
((IDisposable)null).Dispose();
IL_0023: ldnull
IL_0024: callvirt instance void [mscorlib]System.IDisposable::Dispose()
3 Réponses :
La spécification de la langue indique explicitement (8.13) que la valeur capturée est testée pour NULL si nécessaire, c'est-à-dire que le enfin code> est essentiellement (avec des caves autour des types non nullables)
IEnumerable blah = ...; // note non-generic version
IEnumerator iter = blah.GetEnumerator();
using(iter as IDisposable)
{
// loop
}
Merci pour une belle astuce avec comme Idisposable i>. Exactement ce que je cherchais.
C'est trop intelligent pour mon goût :)
Je pense que c'est un résultat naturel du cas plus général de Il aurait nécessité une règle spéciale de distinguer ce cas de plus général. p> en utilisant (quelque_expression) code>, où
quelque_expression code> est autorisé à évaluer à
null code>
. p>
Il ignore si l'objet est NULL - http://msdn.microsoft .com / fr-US / bibliothèque / yh598w02.aspx p>
Où dit-il que dans la documentation que vous avez liée? Une recherche sur null code> sur cette page renvoyée 0 hits.
Dans la section des remarques. Si (Font1! = NULL) ((Idisposable) FONT1) .Dispose ();
> Une déclaration utilisée est traduite en trois parties: acquisition, utilisation et élimination. L'utilisation de la ressource est implicitement jointe dans une énoncé d'essai qui inclut enfin une clause. Cette clause élève enfin la ressource. Si une ressource NULL est acquise, aucun appel à disposer n'est effectué et aucune exception n'est lancée. msdn.microsoft.com/en-us/library /AA664736(V=VS.71).aspx
Hmmm ... je suis maintenant très douteux de ce post, donné le récent blog d'Eric ... est-ce vraiment une véritable question?
N'est-ce pas déjà demandé? Stackoverflow.com/questions/2522822 / ...
Oui, ça me semblait artificiel.