Je suis tombé par hasard sur un étrange problème en C# /. Net 4.5.2 ici ...Ordre d'évaluation pour Debug.Assert (condition, interpolatedStringMessage) en .Net 4.5.2
J'ai eu un chèque !ContainsKey()
dans un Debug.Assert()
avec une chaîne interpolée contenant la valeur, se trouve, comme si
var dict = new Dictionary<string, string>();
string invalidKey = "invalidKey";
try
{
Debug.Assert((!dict.ContainsKey(invalidKey)), $"{nameof(dict)} contains the key {dict[invalidKey]}!");
}
catch (KeyNotFoundException)
{
Console.WriteLine("AssertionString was interpolated before the check was performed!");
}
(seulement sans le bloc try-catch dans ma première version)
je l'aurais prévu de ne jamais courir dans la catch
il , comme c'est aussi le cas quand e. g. vérifier le code .NETFiddle (voir https://dotnetfiddle.net/RyQooW), cependant, dans Visual Studio, exécutant le code sous .Net 4.5.2, je reçois le texte suivant:
interpolated string evaluated before assertion condition
Il est certainement l'interpolation de chaîne (et non problème avec ContainsKey
), car lorsque je supprime l'interpolation du message, l'exception n'est pas levée.
L'ordre d'évaluation n'est-il pas garanti? Je pensais que la chaîne ne serait pas interpolée si l'assertion était vraie.
Ou est-ce juste une erreur dans cette version du Runtime .Net (peut-être une optimisation pour interpoler les chaînes d'assertion tôt pour les rendre statiques ou quelque chose?)
Merci pour toute entrée et cheers!
Quelle version .NET utilisez-vous? Je n'ai aucune exception avec v4.6.1. – dymanoid
@dymanoid 4.6.1 aussi, sur un système Windows 8.1 avec VS 2015 Update 3 –