Dans les génériques C #, nous pouvons déclarer une contrainte pour qu'un paramètre de type T
ait un constructeur par défaut, en disant where T : new()
. Cependant, aucun autre type de contrainte comme celui-ci n'est valide - new(string)
par exemple, etc.
Du point de vue de la conception et / ou de la mise en œuvre d'un langage, quelle en est la raison?
Y a-t-il quelque chose dans la façon dont les constructeurs fonctionnent ou dans la façon dont le système de type est implémenté qui l'interdit (ou du moins le rend plus difficile)? Si oui, c'est quoi? Je me souviens avoir lu quelque part qui default(T)
compile réellement new T()
pour T : struct
. Est-ce lié à cela, peut-être?
Ou s'agit-il simplement d'une décision de conception prise pour éviter de compliquer le langage?
la source
new(string)
n'est pas une contrainte de constructeur par défaut. Votre question revient à dire "Pourquoi n'y a-t-il pas des contraintes qui nécessitent des signatures de constructeur spécifiques?" Très probablement parce qu'une telle contrainte ne serait pas particulièrement utile.Réponses:
Pour une réponse faisant autorité, je vous renvoie à la réponse d'Eric Lippert à cette question sur StackOverflow il y a quelques années, dont un extrait est brièvement cité ci-dessous.
la source
La décompilation (selon la suggestion de Robert Harvey) a produit ce qui suit, pour toute personne intéressée. Cette méthode:
Apparemment, une fois compilé, cela devient:
T
est un type de valeur,new()
devientdefault(T)
.T
est un type de référence,new()
fonctionne en utilisant la réflexion.Activator.CreateInstance()
appels internesRuntimeType.CreateInstanceDefaultCtor()
.Donc, il est là - en interne, les constructeurs par défaut sont vraiment spéciaux pour C # par rapport au CLR. Donner à d'autres constructeurs le même traitement aurait été coûteux, même s'il existe des cas d'utilisation valables pour des contraintes plus complexes dans les génériques.
la source
default(T)
pour les types de valeur?t
variable (qui pourrait être remplacée par desreturn
instructions imbriquées ).