Comment initialiser KeyValuePair objet de la bonne façon?
J'ai vu (entre autres) cette question que les gens se demandent comment initialiser une instance de KeyValuePair, ce qui évidemment doit ressembler à cela.
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>
{
Key = 1,
Value = 2
};
Ça ne fonctionne pas, comme si les propriétés ne sont pas là. Intead, j'ai besoin d'utiliser le constructeur de ce genre.
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);
Certes syntaxe plus courte, mais ça me dérange que je ne peux pas utiliser l'initialiseur. Ce que je fais mal?
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas mal, vous avez à l'initialisation d'un keyValuePair à l'aide de
La raison pour laquelle vous ne pouvez pas utiliser l'objet de l'initialisation de la syntaxe ie { Touche = 1, Valeur = 2 } est parce que la Clé et la Valeur des propriétés ont pas de poseurs seulement les accesseurs (ils sont en lecture seule). Si vous ne pouvez même pas faire:
KeyValuePair<int, int>
est un struct, et, heureusement, il est immuable struct. En particulier, cela signifie que ses propriétés sont en lecture seule. Donc, vous ne pouvez pas utiliser l'objet intializer pour eux.struct
lui-même n'est pas égal àimmutability
.new Tuple<int, int> { Item1 = 1, Item2 = 2 }
donne exactement la même erreur (avec une erreur qu'aucune surcharge du constructeur pourTuple<,>
prend 0 arguments).Ok vous avez les réponses. Comme une alternative, je préfère usine modèle similaire à
Tuple
classe, pour l'inférence de type de magie 🙂Si court devient plus courte:
Dictionnaires compact initialiseurs:
Dans ce cas, le dictionnaire que j'ai utilisé pour associer les extensions de fichiers avec format d'image constantes d'objets du diagramme.
Un seul keyvaluepair peuvent être retournés dans le dictionnaire, comme ceci:
La Clé et la Valeur des propriétés ont pas de poseurs. C'est pourquoi vous ne pouvez pas les utiliser dans l'initialiseur. Juste utiliser le constructeur 🙂 et vous serez amende.
Voici un exemple qui fait le travail
La Clé et Valeur propriétés sont en lecture seule, vous ne pouvez donc pas les utiliser dans un initialiseur d'objet.
Voir cette entrée dans le Guide de programmation C# .
Vous ne faites pas quelque chose de mal. Le KeyValuePairs propriétés sont en lecture seule. Vous ne pouvez pas définir. En outre, il n'y a pas de vide dans le constructeur par défaut. Vous devez utiliser le constructeur fourni.
var test = new KeyValuePair<int, int>();
sera toujours OK. La raison en est queKeyValuePair<,>
est une struct. Et pour une struct, la valeur par défaut (également appelédefault(KeyValuePair<int, int>)
) sera créé si vous utilisez unnew
objet d'expression avec des arguments zéro. Dans ce cas, une paire d'où à la fois la clé et la valeur sontdefault(int)
qui est à zéro.