Ric*_*ard 5 c# named-parameters out-parameters compiler-bug
简短版本:参数后面的命名参数out给出了编译器错误,但我在语言规范中找不到对此行为的任何支持.
长版:
我正在使用Enum.TryParse<TEnum>三个参数重载,但我更喜欢命名ignoreCase参数以使我的代码更清晰,调用如下:
MyEnum res;
b = Enum.TryParse<MyEnum>(inputString, true, out res);
Run Code Online (Sandbox Code Playgroud)
留下布尔不清楚的含义(除非这个方法已知1).因此我想用:
b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true);
Run Code Online (Sandbox Code Playgroud)
但是,编译器将此报告为错误:
命名参数'ignoreCase'指定已为其指定了位置参数的参数
并且IDE突出显示该ignoreCase参数.针对.NET 4的VS2010以及针对4或4.5的VS11 Beta都会产生相同的结果.在所有情况下,命名out参数都会删除错误.
b = Enum.TryParse<MyEnum>(inputString, result: out res, ignoreCase: true);
Run Code Online (Sandbox Code Playgroud)
我已经在框架和我的程序集中尝试了许多不同的方法(包括避免泛型)2:总是相同的结果:out参数后跟命名参数会产生错误.
我看不出有什么理由错误,并且第7.5.1节参数列表中的C#语言规范: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";
}
Run Code Online (Sandbox Code Playgroud)
除非out参数也被命名,否则此调用也会对命名参数给出相同的错误:
TestMethod(1, out aString, two: 1.0f);
Run Code Online (Sandbox Code Playgroud)
命名参数不允许您"跳过"位置参数.
您的代码被解析为传递前两个arguments- value和ignoreCase,再传递ignoreCase一次.
它与out参数的ness 无关.
你可以通过传递最后一个参数来修复它.
| 归档时间: |
|
| 查看次数: |
3651 次 |
| 最近记录: |