コレクションの要素に対して参照による戻りが機能しないのはなぜですか? 質問する

コレクションの要素に対して参照による戻りが機能しないのはなぜですか? 質問する

参照による戻り値の次の例は、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<,>refref passwords[searchTerm]

おすすめ記事