6

短いバージョン:引数に続く名前付き引数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);
4

2 に答える 2

8

名前付きパラメーターでは、位置引数を「スキップ」することはできません。

コードは、最初の2つの引数を渡すものとして解析されますvalue—そしてignoreCase、次にignoreCaseもう一度渡します。パラメータ
の性質とは何の関係もありません。out

名前付きの最後のパラメーターを渡すことで修正できます。

于 2012-03-13T16:27:34.767 に答える
4

すべての位置引数が一致する必要があります。引数に名前を付けて順序を並べ替える場合は、名前を付けた引数の後にすべての引数を並べ替える必要があります。

したがって、このコード行は次のとおりです。

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

と一致しようとするout resignoreCase、そのパラメーターに再度名前を付けることになり、コンパイラーがトリップします。最初のエラーの背後に潜んでいる別のエラーがある可能性があります。out resこれは、に一致しませんignoreCase

したがって、位置引数を処理するときにignoreCaseを「スキップ」する場合は、引数にも名前を付ける必要がありout resます。

于 2012-03-13T16:29:06.333 に答える