短版:out参数后面的命名参数会导致编译器错误,但是我在语言规范中找不到对此行为的任何支持。

完整版:

我正在使用Enum.TryParse<TEnum>三个参数重载,但是我更愿意命名ignoreCase参数来使代码更清晰,调用类似于:

MyEnum res;
b = Enum.TryParse<MyEnum>(inputString, true, out res);

使 bool 值的含义不清楚(除非已知此方法)。因此,我想使用:
b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true);

但是,编译器将其报告为错误:



IDE将突出显示ignoreCase参数。面向.NET 4的VS2010和面向4或4.5的VS11 Beta都给出相同的结果。在所有情况下,命名out参数均会消除该错误。
b = Enum.TryParse<MyEnum>(inputString, result: out res, ignoreCase: true);

我已经在框架和程序集中尝试了多种不同的方法(包括避免使用泛型)2:总是相同的结果:out参数后跟命名参数会产生错误。

我看不到出现此错误的任何原因,C#语言规范的7.5.1节参数列表:4.0版似乎没有提供out后跟命名参数的错误的任何原因。错误文本似乎支持将其解释为错误:没有位置参数可以与ignoreCase有效匹配。

我对规范的阅读错误吗?还是这是编译器错误?

C#7.2更新

使用C#7.2取消调用时,对所有命名参数的此限制必须跟随位置参数。

参见https://docs.microsoft.com/en-gb/dotnet/csharp/whats-new/csharp-7-2#non-trailing-named-arguments

1因此,《框架设计指南》中的建议建议使用enum参数。

2例如:
private static void TestMethod(int one, float two, out string three) {
  three = "3333";
}

此调用也会对命名参数产生相同的错误,除非out参数也被命名为:
TestMethod(1, out aString, two: 1.0f);

最佳答案

命名参数不允许您“跳过”位置参数。

您的代码被解析为传递前两个参数valueignoreCase,然后再次传递ignoreCase
它与参数的out无关。

您也可以通过传递最后一个参数命名来修复它。

关于c# - 在C#中混合和命名参数: Why Does Out Parameter Need to be Named As Well?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9687969/

10-09 20:32
查看更多