2

案子

今天早上我重构了一些 Logging 方法,需要在普通数组中更改方法的“params”参数。因此,对该方法的调用必须使用数组参数进行更改。我希望方法调用尽可能少地改变,因为它是一种被大量使用的实用程序方法。

我以为我应该能够使用集合初始化程序来调用该方法,但它给了我一个编译错误。请参阅下面示例中的第二个调用。第三次调用也可以,但也会导致错误。

例子

void Main()
{
    // This works.
    object[] t1 = { 1, "A", 2d };
    Test(t1);

    // This does not work. Syntax error: Invalid expression term '{'.
    Test({1, "A", 2d });

    // This does not work. Syntax error: No best type found for implicitly-typed array.
    Test(new[] { 1, "A", 2d });

    // This works.
    Test(new object[] { 1, "A", 2d });
}

void Test(object[] test)
{
    Console.WriteLine(test);
}

问题

  • 有什么方法可以在Test()不先初始化数组的情况下调用吗?
4

1 回答 1

4

问题是 C# 正在尝试推断数组的类型。但是,您提供了不同类型的值,因此 C# 无法推断类型。要么确保所有值都属于同一类型,要么在初始化数组时显式声明类型

var first = new []{"string", "string2", "string3"};
var second = new object[]{0.0, 0, "string"};

一旦你停止使用参数,就没有回头路了。您将被迫初始化一个数组。

替代继续使用参数:

public void Test([CallerMemberName]string callerMemberName = null, params object[] test2){}
于 2014-03-24T09:59:07.963 回答