2010-08-27 8 views
3

Comment puis-je implémenter un paramètre "optionnel" à une fonction telle que lorsque endMarker n'est pas donné, j'utiliserai la valeur d'un paramètre requis startMarker? J'utilise actuellement un type nullable et vérifier si endMarker est nul je l'ai mis à startMarkerC#: Avoir un paramètre "optionnel" qui utilise par défaut la valeur d'un paramètre requis

protected void wrapText(string startMarker, string? endMarker = null) { 
    if (endMarker == null) 
     endMarker = startMarker; 
} 

mais le problème est maintenant je reçois une erreur en disant qu'il ne peut pas lancer string? dans string

(string)endMarker 

comment puis-je cast endMarker à un string donc je peux l'utiliser? ou y a-t-il une meilleure façon de le mettre en œuvre?

Répondre

12

Cela fonctionne:

protected void wrapText(string startMarker, string endMarker = null) { 
    if (endMarker == null) 
     endMarker = startMarker; 
} 

En d'autres termes: enlever le point d'interrogation du string?. System.String est un type de référence et peut déjà être null. La structure Nullable<T> ne peut être utilisée que sur les types de valeur.

+0

+1 qui résout le problème racine. –

+4

Il est important de noter que ceci n'est possible que dans C# 4 et au-delà. –

+10

je veux juste ajouter, le code peut être raccourci à 'endMarker = endMarker ?? startMarker' –

-3

Tu ne peux pas faire quelque chose comme ceci:

protected void wrapText(string startMarker, string? endMarker = null) { 
    if (endMarker == null) 
    { 
     endMarker = "foo"; 
     endMarker = startMarker; 
    } 
} 
+0

-1: Ceci définit simplement '' endMarker' être startMarker' quoi qu'il arrive. – cjk

+0

mieux maintenant, ou devrais-je juste quitter pendant que je suis derrière? – MrBliz

+0

Vous avez toujours une ligne complètement inutile ici ... – cjk

2

Vous devez surcharger la méthode pour avoir un appel sans le paramètre "facultatif". Ensuite, dans cette méthode, vous appelez simplement le passage de la méthode normale dans le même paramètre deux fois:

protected void wrapText(String startMarker, String endMarker) 
{ 
    // do stuff 
} 


protected void wrapText(String startMarker) 
{ 
    wrapText(startMarker, startMarker); 
} 
+0

+1 c'est la solution pour 3.5 et avant. –

Questions connexes