je lutte avec le démontage du CIL du paramètre à l'WriteLine()
appel à:démontage CIL d'un paramètre de fonction impliquant une expression ternaire
FileInfo path = new FileInfo(@"c:\a.txt");
Console.WriteLine("prefix: " + path != null ? path.FullName : "null");
CIL dissasembly
.locals init (
[0] class [mscorlib]System.IO.FileInfo path
)
// ...
IL_000c: ldstr "prefix: "
IL_0011: ldloc.0
IL_0012: call string [mscorlib]System.String::Concat(object, object)
IL_0017: brtrue.s IL_0020
IL_0019: ldstr "null"
IL_001e: br.s IL_0026
IL_0020: ldloc.0
IL_0021: callvirt instance string [mscorlib]System.IO.FileSystemInfo::get_FullName()
IL_0026: call void [mscorlib]System.Console::WriteLine(string)
Il me semble que Concat
est appelée en premier, et alors seulement l'opérateur ternaire est évalué. En particulier:
IL_0012
Concat("prefix", path)
semble être appelé,
IL_0012
brtrue.s IL_0020
// branche basée sur le précédent retour valeur
- Pourquoi
Concat
appelé avecpath
comme paramètre au lieu depath.FullName
? - Est-ce que
Concat
renvoienull
, si son premier paramètre estnull
? Comment le compilateur le sait-il? (Si je remplace+
avec mon propre , le démontage à quelque chose que je préférerais attendre.)
Pourriez-vous s'il vous plaît expliquer, comment le démontage gère le paramètre ternaire et l'appel à WriteLine
?