C'est drôle, je suis mordu par que dans ma question, Pourquoi est-ce que Linq Fonte d'Échouer lors de l'utilisation de ToList?
Jon Skeet (bien sûr) explique que mon problème est le compilateur C#, pour quelque raison que ce soit, pense qu'ils ne pourraient jamais être la même chose, et utilement optimise la valeur false. Cependant, le CLR ne laisser cela se produire. Le casting pour objet déclenche l'optimisation du compilateur, de sorte qu'il passe par le CLR.
La partie pertinente de sa réponse:
Même si en C# vous ne pouvez pas jeter un byte[] pour un sbyte[] directement, le CLR permet:
var foo = new byte[] {246, 127};
// This produces a warning at compile-time, and the C# compiler "optimizes"
// to the constant "false"
Console.WriteLine(foo is sbyte[]);
object x = foo;
// Using object fools the C# compiler into really consulting the CLR... which
// allows the conversion, so this prints True
Console.WriteLine(x is sbyte[]);
Joel posé une question intéressante dans les commentaires, "Est-ce un comportement contrôlé par le Optimiser le Code du drapeau (/o
pour le compilateur)?"
Compte tenu de ce code:
static void Main(string[] args)
{
sbyte[] baz = new sbyte[0];
Console.WriteLine(baz is byte[]);
}
Et compilé avec csc /o- Code.cs
(ne pas optimiser), il semble que le compilateur optimise de toute façon. L'résultant de l'IL:
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: newarr [mscorlib]System.SByte
IL_0007: stloc.0
IL_0008: ldc.i4.0
IL_0009: call void [mscorlib]System.Console::WriteLine(bool)
IL_000e: nop
IL_000f: ret
IL_0008 charges 0 (false) directement sur la pile, puis appelle WriteLine
sur IL_0009. Donc, non, l'option d'optimisation ne permet pas de faire une différence. Si le CLR devait être consulté, l' isinst
enseignement utilisées. Il serait probablement ressembler à quelque chose comme ceci à partir de IL_0008:
IL_0008: ldloc.0
IL_0009: isinst uint8[]
IL_000e: ldnull
IL_000f: cgt.un
IL_0011: call void [mscorlib]System.Console::WriteLine(bool)
Je suis d'accord avec l'optimiseur de comportement. L'option d'optimisation ne doit pas modifier le comportement de votre programme.