2010-06-17 25 views
4

Je travaille avec un code qui a sept surcharges d'une fonction TraceWrite:Résolution de surcharge et paramètres facultatifs en C# 4

 
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, string Data = ""); 
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, bool LogToFileOnly, string Data = ""); 
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, string PieceID, string Data = ""); 
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, LogWindowCommandENUM LogWindowCommand, string Data = ""); 
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, bool UserMessage, int UserMessagePercent, string Data = ""); 
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, string PieceID, LogWindowCommandENUM LogWindowCommand, string Data = ""); 
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, LogWindowCommandENUM LogWindowCommand, bool UserMessage, int UserMessagePercent, string Data = ""); 

(. Tout public static, le bruit des espaces de noms élide ci-dessus et tout au long)

donc, avec ce fond:
1) par ailleurs, j'appelle TraceWrite avec quatre arguments: string, LogLevelENUM, string, bool, et je reçois les erreurs suivantes:

error CS1502: The best overloaded method match for 'TraceWrite(string, LogLevelENUM, string, string)' has some invalid arguments 
error CS1503: Argument '4': cannot convert from 'bool' to 'string'

Pourquoi cet appel ne résout-il pas la deuxième surcharge? (TraceWrite(string, LogLevelENUM, string, bool, string = ""))

2) Si je devais appeler TraceWrite avec string, LogLevelENUM, string, string, quelle surcharge serait appelée? Le premier ou le troisième? Et pourquoi?

+0

pour 1), je n'ai pas pu reproduire l'erreur que vous voyez. Il semble compiler bien pour moi quand je l'appelle avec ceci: TraceWriter.TraceWrite ("", LogLevelENUM.FakeLevel, "", false); –

+0

OK, c'est * bizarre *. Mais ça arrive aussi pour moi. Quelques fois (string, LogLevelENUM, string, bool) compile, et d'autres fois ce n'est pas le cas. Je vais devoir regarder plus dur à cela. –

Répondre

2

Le compilateur choisira la surcharge # 1 car elle correspond exactement au nombre de paramètres et à la signature.

0

Vos surcharges sont mauvaises, vous devriez faire plus de différence entre elles. Le compilateur ne peut pas savoir si vous vouliez dire le premier ou le troisième.

Soit le troisième ne doit pas avoir de valeur par défaut pour son dernier argument, le premier doit avoir un argument différent de la chaîne avant la dernière chaîne ou l'argument PieceID du troisième doit être un int.

Il existe une autre meilleure solution possible: utiliser plusieurs valeurs par défaut. Vous avez tellement de paramètres par défaut qu'ils devraient réduire le nombre de surcharges. Avec plusieurs valeurs par défaut, vous pouvez appeler une méthode en spécifiant uniquement la dernière valeur. J'espère que vous pouvez réduire le nombre de surcharges à 1 ou 2.

public static int add(int a = 0, int b = 0) 
{ 
    return a + b; 
} 
add(b: 1); 
+0

Le nombre de surcharges est le résultat de C# 3.5, et nous pourrions les passer en revue et les nettoyer à un moment donné. Cela mis à part, cette réponse soulève une question de suivi: Si le cinquième argument pour la troisième surcharge n'est pas vraiment optionnel, pourquoi le compilateur permet-il d'être spécifié comme tel? –