Люди,
Я смотрел на эту ветку, пытаясь решить проблему, которой на самом деле не существует, потому что 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 так же? Я полагаю, это должно.