4

関数の7つのオーバーロードを持つコードを使用していますTraceWrite:

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 = "");

(パブリックの静的な名前空間のノイズはすべて、上と全体で省略されています。)

したがって、その背景で: 1) 他の場所では、4 つの引数を使用し
て呼び出します: 、および次のエラーが発生します。TraceWritestring, LogLevelENUM, string, bool

エラー CS1502: 'TraceWrite(string, LogLevelENUM, string, string)' に最適なオーバーロードされたメソッドの一致には、無効な引数が含まれています
エラー CS1503: 引数 '4': 'bool' から 'string' に変換できません

この呼び出しが 2 番目のオーバーロードに解決されないのはなぜですか? ( TraceWrite(string, LogLevelENUM, string, bool, string = ""))

2) で呼び出す場合TraceWritestring, LogLevelENUM, string, stringどのオーバーロードが呼び出されますか? 一代目か三代目?なぜ?

4

2 に答える 2

2

コンパイラは、パラメーターの数とシグネチャが完全に一致するオーバーロード #1 を選択します。

于 2010-06-17T13:45:10.660 に答える
0

あなたの過負荷は悪いです。それらの間にもっと違いを作るべきです。コンパイラは、1 番目または 3 番目のどちらを意味するかを判断できません。

3 番目の引数の最後の引数にデフォルト値を持たないか、最初の引数が最後の文字列の前に別の非文字列引数を持つか、3 番目の PieceID 引数が int である必要があります。

別のより良い解決策が考えられます: 複数のデフォルトを使用します。デフォルトが非常に多いため、オーバーロードの数を減らす必要があります。複数のデフォルト値を使用すると、最後の値を指定するだけでメソッドを呼び出すことができます。うまくいけば、オーバーロードの数を 1 または 2 に減らすことができます。

public static int add(int a = 0, int b = 0)
{
    return a + b;
}
add(b: 1);
于 2010-06-17T13:49:48.403 に答える