Pourquoi je ne peux pas initialiser readonly variables dans un initialiseur?
Pourquoi je ne peux pas initialiser readonly variables dans un initialiseur?
Le suivant ne fonctionne pas comme il devrait:
class Foo
{
public readonly int bar;
}
new Foo { bar=0; }; //does not work
Est-ce en raison de certaines limites techniques de la CLR?
MODIFIER
Je sais que new Foo { bar=0; }
est le même que new Foo().bar=0;
, mais est "readonly" appliquées par le CLR, ou est-ce juste une limitation de compilateur?
À la suite de votre dernière modification, je n'ai aucune idée de ce que vous demandez. Oui,
Gris de restriction de langue, pas de limitation de compilateur. Le compilateur juste implémente la langue.
Euh, j'ai dit "je ne vois pas comment il pourrait en être une limitation de compilateur." Je suis d'accord avec vous.
readonly
est appliquée au moment de l'exécution par le CLR. Je ne vois pas comment il pourrait en être une limitation de compilateur. Les autres réponses expliquer pourquoi ce que vous essayez de faire n'a aucun sens.Gris de restriction de langue, pas de limitation de compilateur. Le compilateur juste implémente la langue.
Euh, j'ai dit "je ne vois pas comment il pourrait en être une limitation de compilateur." Je suis d'accord avec vous.
OriginalL'auteur codymanix | 2010-12-16
Vous devez vous connecter pour publier un commentaire.
Permettant une
readonly
être mis dans un initialiseur introduit des contradictions et des complications qui ne peuvent pas être respectées au moment de la compilation. J'imagine que la restriction est d'éviter toute ambiguïté. La grande clé est au moment de la compilation de validation.Imaginez ceci:
Maintenant, pensez à:
Imaginer que les deux cas ci-dessus sont réunies (par exemple, "par le compilateur de la magie"), toutefois, entrer dans les génériques:
Je crois que le cas que j'ai décrit montrer certaines complications de l'utilisation d'une "dynamique"
readonly
approche et, à la fin de la journée, je crois que c'est simplement un choisi de restriction de langue (compilateurs de mettre en œuvre les langues) de l'application/de permettre la compilation de validation.OriginalL'auteur
L'initialiseur est juste sucre syntaxique. Lorsque vous écrivez:
(Qui, en passant, est une erreur de syntaxe et doit être cela...)
ce qui se passe réellement est:
Depuis la propriété est en lecture seule, la seconde déclaration est invalide.
Edit: Basé sur votre montage, la question est un peu floue. Un
readonly
propriété est, par conception, et non réglable. Il est construit à la construction de l'objet. Ceci est renforcé par le compilateur et le moment de l'exécution. (Certes, je n'ai pas testé cette dernière, car il faudrait une ruse pour obtenir autour de l'ancien.)Garder à l'esprit qu'il y a deux étapes de la "compilation." Qu'il est appliqué lors de la compilation du code C# en IL code, et qu'il est appliqué lors de la compilation du code de langage en code machine.
Ce n'est pas une limite technique de la CLR, et ça fonctionne exactement comme il se doit, compte tenu de l'explicite
readonly
déclaration. Après que l'objet est construit, vous ne pouvez pas définir dereadonly
propriété.Cette réponse est de mieux en mieux. Je l'ai vu deux fois maintenant et disparu pour upvote, quand j'ai réalisé que j'avais déjà.
Gris: Quelqu'un semble en désaccord, il y a un downvote. Je suis assez sûr que la question est un doublon de toute façon, je pense. Il est difficile de dire à l'intention de ce qui est demandé.
Il n'y a pas de limitation, si vous utilisez de la réflexion, afin par exemple
typeof(Foo).GetField("bar").SetValue(oldFooInstance, 42);
permet de changer la valeur du champ en lecture seule.Absolument! Et il sera susceptible de faire l'objet de dysfonctionnement puisque les auteurs de
Foo
ne vous attendez pas à le faire. Mais peut-être que la personne n'était intéressé, dans ce cas comme un commentaire à votre réponse très.OriginalL'auteur David
Depuis
readonly
variables doit être initialisé dans le constructeur, et bien d'initialiseurs de s'exécuter après la construction de l'objet, qui n'est pas valide.OriginalL'auteur decyclone
Car un initialiseur est équivalent à
C'est une réécriture derrière les coulisses.
OriginalL'auteur Albin Sunnanbo
Ce que vous essayez de faire est ceci:
OriginalL'auteur Stefan
Parce que vous avez spécifié, il est en lecture seule. Il ne fait pas de sens pour indiquer que quelque chose est en lecture seule, puis attendre une écriture déclaration de travaux.
OriginalL'auteur Joel Etherton
Selon cette page, le CLR par défaut-les constructions de l'objet en premier lieu avant le traitement de l'initialiseur de liste, et vous êtes donc d'assigner à
bar
deux fois (une fois par défaut de la construction, une fois lorsque l'initialisation est traitée).OriginalL'auteur Platinum Azure
C'est un résultat de la mise en œuvre de la readonly mot-clé. La citation ci-dessous est tiré de la Référence MSDN pour readonly:
OriginalL'auteur nabrond
Il n'y a pas beaucoup de mal dans votre code ou les hypothèses, à l'exception peut-être qu'il est une caractéristique importante de l'initialiseur de listes d'imposer aucune séquence de contraintes (particulièrement vrai pour C++). Le point-virgule est un séquençage de l'opérateur, par conséquent initialiseur de listes séparées par des virgules à la place.
Sauf si vous faites valoir que les spécifications sont correctes, par définition, je crois que la spécification du langage est mal ici. En partie à des pauses d'une caractéristique importante de la langue qui est la notion de lecture-seule. L'ambiguïté des problèmes mentionnés dans les autres réponses ont à mon avis une seule cause sous-jacente. Readonly est un très intrusive fonctionnalité et va de la moitié du chemin concernant const correctness est difficile d'obtenir le droit et, plus important encore, nuisible pour le codage des styles développés.
Ce que vous cherchez et probablement trouvé, dans l'intervalle sont les arguments nommés: https://stackoverflow.com/a/21273185/2712726
Ce n'est pas ce que vous avez demandé, mais il obtient près de.
Aussi pour être juste, je dois ajouter qu'il est très compétent, les auteurs qui vont pas du tout d'accord avec ces points de vue sur const exactitude que les développeurs C++ ont souvent. Eric Lippert, qui certes ont des postes a écrit cette (horrible pour les développeurs C++): https://stackoverflow.com/a/3266579/2712726
OriginalL'auteur Patrick Fromberg