2011-11-10 24 views
3

最近、.NET 3.5でデリゲートを使用してWriteLineを行うコードを作成していました。私はWriteLineのオーバーロードと同じシグネチャのデリゲートとの一致なし

public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3)

私は、.NET 3.5を使用していたように私はquicly自分の書いた何Action<T1, T2, T3, T4, T5>デリゲートがないですWriteLineメソッドのオーバーロードに来るまで それはすべての様々な異なるアクションデリゲートを使用してうまくいきました。

public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);

私は、このメソッドAction<string, object, object, object, object> action = Console.WriteLine;にWriteLineメソッドを割り当てるために行って、私は、エラーメッセージが表示されました

私は明示的に新しいを宣言したので、これはいくつかのジェネリック医薬品の問題の結果として引き起こされる必要があると思った「WriteLineに」マッチデリゲート「アクション<文字列、オブジェクト、オブジェクト、オブジェクト、オブジェクト>」

なしのオーバーロードデリゲート:

public delegate void WriteLineAction(string format, object arg0, object arg1, object arg2, object arg3);

私は、この新しいメソッドにWriteLineメソッドを割り当てる試み、再びエラーメッセージました:

「WriteLineに」マッチデリゲート「WriteLineAction」

のためにも、他人の事は、私は右のエラーでありますConsole.WriteLineを呼び出しをクリックして、「定義に移動」と言う場合、それは私を取ることではありませんオーバーロードは、 正しいバージョンのWriteLineがメタデータに含まれているため、そのメソッドをデリゲートに一致させることができないのはなぜですか?私は本当にここで何か愚かなことをしていますか、これは既知の問題/機能ですか?

+0

ない、これはあなたが達成しようとしているものですが、柔軟なログを実装しようとしている場合、あなたは[NLog](HTTPのようなライブラリに見たいと思うかもしれませんかどうかわから:リフレクターでは、として表示されます://nlog-project.org/)。それは岩: –

+0

あなたは正しいです、これは奇妙です...WriteLineメソッドのシグネチャを新しい静的クラスにコピーしました。そのデリゲートをポイントするとうまくいきます。 – edvaldig

答えて

2

あなたはdocs for this overloadを見れば、それは示しています

このAPIは、CLSに準拠していません。 CLS準拠の代替はWriteLine(String, Object[])です。

とあなたが署名のC#]タブを見れば、それは言う:

C#は、可変長引数(可変引数)を使用する方法をサポートしていません。 コンパイラは、このメソッドへの呼び出しを、パラメータ配列を使用する同じメソッドに自動的に解決します。私は強く、これが問題である疑いがある

public: 
static void WriteLine(
    String^ format, 
    Object^ arg0, 
    Object^ arg1, 
    Object^ arg2, 
    Object^ arg3, 
    ... 
) 

C++]タブでは、として署名を示しています。

public static void WriteLine(string format, object arg0, object arg1, 
    object arg2, object arg3, __arglist) 
+0

ああ、私は.NET 4のような他のメソッドに解決されているとは言わない文書のVS9.0バージョンを使用していました。 http://msdn.microsoft.com/en-us/library/fc0cx9a5(v=VS.90).aspx –

関連する問題