4
votes

String.Join - comportement différent pour le paramètre et la valeur directe

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 commentaires

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.


3 Réponses :


5
votes

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) ; 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.


4 commentaires

@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é



2
votes

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.


0 commentaires

2
votes

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 =)


2 commentaires

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 =)