伙计们,
我在看这个线程,试图解决一个实际上不存在的问题,因为 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 做到了,我只是以某种方式期望它很难......因此认为这个技巧的简单性和“好” - the-language 值得注意。
CSharpLanguageDesigners.ToList().ForEach(dude=>dude.Kudos++);
干杯。基思。
PS:我想知道 VB.NET 的行为方式是否相同?我想它必须。