J'écris de l'IL personnalisé et j'ai besoin de quelque chose d'équivalent à return SomeStaticField != null;
. C'était ma conclusion naturelle:Pourquoi cette vérification null .NET IL ne fonctionne-t-elle pas comme prévu?
volatile.ldsfld ...SomeStaticField //volatile is needed here for unrelated reasons
ldnull
ceq
not
ret
Cependant, cela ne semble pas fonctionner. J'ai confirmé que SomeStaticField est null, mais cette fonction finira par retourner vrai. Je sais que C# utilise les branches pour une telle construction, et je pourrais l'utiliser aussi, mais il me déconcerte pourquoi cela ne serait pas le comportement attendu
Un exemple complet et vérifiable (comme une bibliothèque):
.assembly extern /*23000001*/ mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89) // .z\V.4..
.ver 4:0:0:0
}
.assembly 'BareMetal'
{
.custom instance void class [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::'.ctor'() = (
01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module BareMetal.dll
.namespace Earlz.BareMetal
{
.class public auto ansi abstract sealed beforefieldinit BareMetal
extends [mscorlib]System.Object
{
.method public static hidebysig
default bool FooTest() cil managed
{
.maxstack 2
ldnull
ldnull
ceq
not
ret
}
}
}
Il devrait fonctionner, [CEQ est certainement utilisé pour les contrôles null] (http://stackoverflow.com/questions/24023705/when-i-use-is-operator-why-there-is-only -a-null-check-in-il-code). S'il vous plaît fournir un [mcve]. – Heinzi
"pas" n'est-ce pas. Toujours préférable de laisser le compilateur C# générer le msil en premier et le regarder avec ildasm.exe. Personne ne pense à utiliser 'cgt.un'. –
@Heinzi J'ai mis à jour pour ajouter un exemple complet (en remplaçant le ldsfld par un ldnull pour plus de simplicité) – Earlz