11
votes

Pourquoi les paramètres facultatifs du C # 4.0 nécessitent-ils des constantes de compilation?

Il existe également un moyen d'utiliser des valeurs de temps d'exécution pour les paramètres de la méthode optionnels?


3 Réponses :


5
votes

Les paramètres facultatifs sont compilés dans l'ensemble et en tant que tel (tout comme tout ce qui est désigné comme const ), ils doivent être une constante de temps de compilation.

et non, vous ne pouvez pas utiliser les valeurs de temps d'exécution comme paramètres facultatifs.


1 commentaires

Merci mais ne peut-il pas compiler avec une référence à une référence de temps d'exécution? Alors dites quelque chose comme: this.filename, etc. dans la même classe?



12
votes

Les paramètres facultatifs sont nécessaires pour être des constantes car ils sont écrits comme des valeurs d'un attribut. Par conséquent, ils héritent de toutes les restrictions qu'une valeur d'attribut a.

Il n'y a aucun moyen d'encoder directement une valeur d'exécution. Cependant, vous pouvez vous rapprocher du modèle suivant xxx


7 commentaires

Merci, cela semble être un truc soigné. Par curiosité, savez-vous pourquoi ils sont mis en œuvre à l'aide d'attributs? Je suppose que je réutilise ce qui est déjà dans le cadre?


@Joan IIRAC Il est fait avec des attributs car c'est comme ça que d'autres langues (VB.NET) le font et permettent donc de la compatibilité avec elles.


@Joan: En utilisant des attributs, ils ne cassent pas les langues qui n'ont pas cette fonctionnalité. N'oubliez pas que tout dans .NET est compilé dans une forme qui doit être neutre de langue ... Les attributs sont un moyen propre de gérer les paramètres facultatifs dans une langue spécifique, sans nécessiter de modifier les autres langues .NET.


@Jared: Merci, mais maintenant je me rends compte, si l'astuce que vous avez montrée ne fonctionnerait pas pour des types de valeur ou des types de référence où vous voulez légitimement passer NULL, non?


@Reed: Merci c'est un bon point. Mais si c'était une caractéristique étendue de IL, cela le briserait-il encore pour d'autres langues? Comme dire quelque chose de plus que seulement c # sorties à IL?


@Joan: Cela nécessiterait un changement de CLR pour soutenir cette fonctionnalité - la façon dont ils l'ont fait, il correspondait à la mise en œuvre existante de la VB, n'a aucun impact sur d'autres langues et "fonctionne simplement" ...


Oui c'est ce que je voulais dire. Ça a du sens. Ils sont venus avec la route la plus facile alors.



5
votes

Les paramètres facultatifs sont déterminés à Compilation Time et substitués dans la méthode si vous appelez une méthode avec trop peu de paramètres. Ils sont gérées en ajoutant un attribut au paramètre dans l'IL de la méthode.

En tant que tel, ils doivent être complètement résolus au moment de la compilation (à la fois pour la création, car ils sont un attribut, mais aussi lorsqu'il est utilisé). Il n'ya aucun moyen d'utiliser des valeurs d'exécution pour les paramètres de méthode facultatifs.


0 commentaires