皆さん、
私はこのスレッドを見て、実際には存在しない問題を解決しようとしていました。C#はparams配列を「通過するだけ」だからです。試してみるまでわからなかった。
これがSSCCEです。
using System;
using System.Diagnostics; // for Conditional compilation of method CONTENTS
namespace ConsoleApplication3
{
public static class Log
{
[Conditional("DEBUG")] // active in Debug builds only (a no-op in Release builds)
public static void Debug(string format, params object[] parms) {
Console.WriteLine(format, parms);
// calls Console.WriteLine(string format, params object[] arg);
// which I presume calls String.Format(string format, params object[] arg);
// (Sweet! just not what I expected ;-)
}
}
class Program //LogTest
{
static void Main(string[] args) {
Log.Debug("args[0]={0} args[1]={1}", "one", "two");
Console.Write("Press any key to continue . . .");
Console.ReadKey();
}
}
}
生産:
args[0]=one args[1]=two
甘い!
しかし、なぜ?...まあ(もちろん)非常にオーバーロードされたConsole.WriteLineメソッドに最も近いパラメーターの一致は(string format, params object[] arg)
...(string format, object arg)
私が思っていたものではないからです。
Console.WriteLineがそれを行うので、私はこれがどういうわけか可能でなければならないことをある程度知っていました、私はそれがハードであるとどういうわけか期待していました...したがって、このトリックのシンプルさと「素晴らしさ」は言語は注目に値します。
CSharpLanguageDesigners.ToList().ForEach(dude=>dude.Kudos++);
乾杯。キース。
PS: VB.NETが同じように動作するのだろうか?私はそれがしなければならないと思います。