Le code ci-dessous serait assez cool si cela fonctionnait. Cependant, je ne peux pas l'obtenir pour compiler, alors je suppose que cela ne va pas fonctionner sous quelque forme que ce soit? La meilleure option suivante est de faire P > public void foo(char[] bar = null)
{
if (bar==null)
bar = new {'a'};
}
5 Réponses :
non, car les valeurs par défaut des paramètres facultatifs doivent être constantes. P>
Pourquoi les paramètres facultatifs de C # 4.0 nécessite des constantes de temps de compilation? P>
Non, ce n'est pas possible. La valeur par défaut doit être une constante de temps de compilation. La valeur par défaut sera insérée dans l'appelant, pas la callee. Votre code serait un problème si l'appelant n'a pas accès aux méthodes utilisées pour créer votre valeur par défaut.
Mais vous pouvez utiliser des surcharges simples: P>
public void foo(char[] bar) { } public void foo() { foo(new char[]{'a'}); }
qui ne fonctionnera jamais car caractère [] n'est pas un type de valeur mais plutôt un type de référence. Seuls les types de valeurs peuvent avoir des constantes qui leur sont attribuées dans des paramètres facultatifs. Vous ne pouvez pas avoir de référence à un objet (tel qu'un tableau) lors de la compilation. (NULL est la seule valeur valide pour un type de référence optionnel.) P>
A Nitpick: Les chaînes sont des types de référence et void m (string s = "bonjour") {} code> est parfaitement légal!
@Lukeh: C'est vrai, mais les architectes de .net sont passés à certaines longueurs pour dissimuler ce fait et faire se conduire la chaîne comme un type de valeur. La chaîne est définitivement une exception dans une variété de concepts .NET.
uniquement avec Types de valeur em> Vous avez la possibilité de définir la valeur par défaut d'un paramètre pour compiler des constantes de compilation (le rendant facultatif). Pour types de référence em>, seules les chaînes ont cette capacité. D'autres types ne peuvent être définis que sur NULL. P>
edit strong>: merci@martinho Fernandes pour pointer cela. Pour les types de valeur, seules les constantes de compilation sont autorisées p>
Cette affirmation sur les types de valeur est fausse. Void FOO (DateTime x = Nouvelle DateTime (2011,3,22)) {} code> ne parvient pas à compiler. Ce que vous pouvez utiliser est Constantes de compilation de compilation i>.
D'autres commentaires s'appliquent également, mais considérons également que, puisque la valeur par défaut est insérée dans l'appelant lors de la compilation, la modification de la valeur par défaut à une date ultérieure ne modifiera pas la valeur dans le code de l'appelant (en supposant que c'est appelé. Une autre assemblée.) À cause de cela, ce que vous proposez comme un autour de Work-autour de em> ou la meilleure option suivante, est en fait un meilleur em> strong> pratique . p>
Quelle erreur génère-t-elle? Cela vous donnerait une idée de la raison pour laquelle cela ne fonctionne pas.
@ChRISF, valeur de paramètre par défaut pour 'bar' doit être une constante de la compilation