短版: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);
最佳答案
命名参数不允许您“跳过”位置参数。
您的代码被解析为传递前两个参数value
和ignoreCase
,然后再次传递ignoreCase
。
它与参数的out
无关。
您也可以通过传递最后一个参数命名来修复它。
关于c# - 在C#中混合和命名参数: Why Does Out Parameter Need to be Named As Well?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9687969/