参照による戻り値の次の例は、C# 7.0 の新機能:
public ref int Find(int number, int[] numbers)
{
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] == number)
{
return ref numbers[i]; // return the storage location, not the value
}
}
throw new IndexOutOfRangeException($"{nameof(number)} not found");
}
これは問題なくコンパイルされます (Microsoft ブログからコピーされたので当然のことです)。
私はこれを書きました:
private static ref int GetReference(string searchTerm)
{
var passwords = new Dictionary<string, int>
{
{"password", 1},
{"123456", 2},
{"12345678", 3},
{"1234", 4},
{"qwerty", 5},
{"12345", 6},
{"dragon", 7}
};
return ref passwords[searchTerm];
}
ただし、これはコンパイルされず、次のエラーが発生します。
CS8156 式は参照によって返されない可能性があるため、このコンテキストでは使用できません。
配列からの戻りは機能するのに、コレクションからの戻りは機能しないのはなぜですか?
ベストアンサー1
C# では、ref
次の場合に機能します:
- 変数(ローカルまたはパラメータ)
- 田畑
- 配列の場所
ref
以下の場合には機能しません:
- プロパティ
- イベント
- C# 7の場合のローカル変数はrefで返されます
フィールドと配列の場所については、配列にアクセスする方法は関係ないことに注意してください。つまり、return ref numbers[i];
は ではなくnumbers
、それが指す配列を保持します。がフィールドであるreturn ref numbers;
場合にのみ機能する とはまったく異なります。numbers
ただし、のインデックス プロパティref
で を使用していますが、これはそもそも でサポートされている式ではありません(つまり、C# 7 より前でも引数として渡すことはできません)。ref で返すことはできません。Dictionary<,>
ref
ref passwords[searchTerm]