J'exécute le code ci-dessous, result1 est égal à "" mais string.Join (",", null) lance une exception
.ForMember(dst => dst.Ids, opt => opt.MapFrom(src => src.Ids == null ? null : string.Join(",", src.Ids)))
De plus, cela ne fonctionne pas pour ce code (lance un exception)
.ForMember(dst => dst.Ids, opt => opt.MapFrom(string.Join(",", src.Ids)))
Mais ça marche pour ça:
string str = null; var result1 = string.Join(",", str); var result2 = string.Join(",", null);
Comment expliquer ce comportement?
3 Réponses :
Les deux utilisent la même surcharge de string.Join
- qui est celui qui prend une chaîne comme séparateur et string []
comme valeur.
Plus précisément - params string [] value
- et c'est le point clé du comportement de différence observé.
La première ligne de code - string.Join (",", str) ;
où str
est une référence nulle d'une chaîne, est en fait résolu comme string.Join ("," new string [] {null})
.
La deuxième ligne, cependant, est résolue comme string.Join ("," null)
. - ce qui signifie que le tableau de chaînes lui-même est nul et donc l'exception est levée.
update Vous obtenez des résultats différents avec automapper car le résultat du code suivant
string str = null; var result1 = string.Join(",", str);
n'est pas nul, c'est une chaîne vide.
@BasilKosovan, rien avec le mappeur automatique, veuillez voir ma réponse
J'ai une exception, pas [null] et [string empty] @ZoharPeled
Je suppose que src.Ids
est un tableau, donc cela fonctionne comme var result2 = string.Join (",", null);
@BasilKosovan "J'ai une exception" -> Quelle exception obtenez-vous? Quoi qu'il en soit, cela semble être une question différente de celle avec laquelle vous avez commencé
Le 2ème paramètre pour la jointure prend la chaîne de paramètres [] valeur
. Dans votre premier cas, vous envoyez un tableau de chaînes avec 1 valeur (null). Pour le deuxième cas, vous envoyez null comme tableau de chaînes.
Premier essai
string.Join(",", (string[])null);
Le code ci-dessus est transposé en
var result2 = string.Join(",", null);
Deuxième essai strong>
Et la dernière ligne de code;
string text = null; string[] obj = new string[1]; string text2 = string.Join(",", obj);
traduit en;
string str = null; var result1 = string.Join(",", str);
Vous pouvez voyez-vous à https://sharplab.io/#v2:CYLg1APgAgTAjAWAFBQMwAJboMLoN7LpGYZQAs6AsgBQCU+hxTjTRUcADOgM4AuATugC86AHYBXADaSA3MgBuAQ0H8Aptym84wzJwB0AKQD2AS1HUARABprPAbTlIlK9Zpg72HQ6fPXbE6QcWdABfZBCgA==
PS: sharplab is love =)
Merci et +1 d'avoir prouvé ma réponse :-)
Ikr, ta réponse en fait bien, mais parfois les gens ont besoin de le voir de leurs propres yeux =)
Le deuxième appel
Join
n'est pas la même fonction que celle appelée.null
en lui-même n'a pas de type.@John appelle tous les deux la même méthode
@TanveerBadar J'ai ajouté un autre exemple.