短いバージョン:引数に続く名前付き引数out
はコンパイラエラーを出しますが、言語仕様でこの動作のサポートを見つけることができません。
ロングバージョン:
私は3つのパラメーターのオーバーロードを使用していますが、コードを明確にするためにパラメーターにEnum.TryParse<TEnum>
名前を付けたいと思います。次のような呼び出しです。ignoreCase
MyEnum res;
b = Enum.TryParse<MyEnum>(inputString, true, out res);
ブール値の意味が不明確になります(この方法が知られていない場合1)。したがって、私は使用したいと思います:
b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true);
ただし、コンパイラはこれをエラーとして報告します。
名前付き引数'ignoreCase'は、位置引数がすでに指定されているパラメーターを指定します
IDEはignoreCase
パラメータを強調表示します。.NET 4を対象とするVS2010、および4または4.5を対象とするVS11 Betaは、すべて同じ結果をもたらします。いずれの場合も、out
パラメーターに名前を付けるとエラーが削除されます。
b = Enum.TryParse<MyEnum>(inputString, result: out res, ignoreCase: true);
フレームワークとアセンブリの両方から、さまざまな方法(ジェネリックスの回避を含む)2でこれを試しました。常に同じ結果です。out
パラメーターの後に名前付きパラメーターを指定すると、エラーが発生します。
このエラーの理由はわかりません。§7.5.1C #言語仕様の引数リスト:バージョン4.0out
では、名前付きパラメーターが後に続くとエラーが発生する理由は提供されていないようです。エラーのテキストは、バグとしての解釈をサポートしているようです。に有効な一致となる可能性のある位置引数はありませんignoreCase
。
仕様の読み方が間違っていますか?それとも、これはコンパイラのバグですか?
C#7.2アップデート
C#7.2で呼び出しが解除された場合、すべての名前付き引数に対するこの制限は、位置引数に従う必要があります。
https://docs.microsoft.com/en-gb/dotnet/csharp/whats-new/csharp-7-2#non-trailing-named-argumentsを参照してください。
1enum
したがって、パラメータを優先するためのフレームワーク設計ガイドラインのアドバイス。
2例:与えられた:
private static void TestMethod(int one, float two, out string three) {
three = "3333";
}
この呼び出しでも、out
パラメーターに名前が付けられていない限り、名前付きパラメーターで同じエラーが発生します。
TestMethod(1, out aString, two: 1.0f);