bugfix> c# > 投稿

C#の ref return を使用できるかどうか疑問に思っていました set を定義する(辞書)インデクサーまたはプロパティおよび get アクセサー、例:

readonly Dictionary<string, int> dictionary = ...;

ref int v = ref dictionary["foo"];
//          ^^^^^^^^^^^^^^^^^^^^^
// CS0206: A property or indexer may not be passed as an out or ref parameter
v = 42;

どういうわけか ref を提供することは可能ですかプロパティまたはインデクサーへの機能(リフレクションを使用しない)?もしそうなら、どのように?


エラーメッセージがその意味で明確であることはわかっていますが、その実装に最適な方法はどれかと思いました。意味論

回答 2 件
  • これにはインデクサーを実装する型 プロバイダー ref へ -戻るインデクサー内、いいえ: Dictionary<string, int> では使用できません 。しかし、このようなもので:

    class MyRefDictionary<TKey, TValue>
    {
        public ref TValue this[TKey key]
        {   // not shown; an implementation that allows ref access
            get => throw new NotImplementedException();
        }
    }
    
    

    あなたは確かにできます:

    ref var val = ref dictionary[key];
    
    

    配列は常にrefインデクサーアクセスを許可しているため、配列は特殊なケースであることに注意してください。

    SomeMethod(ref arr[42]);
    
    

    (配列内のインデクサーアクセスは、型ではなくコンパイラによって実装されます)

  • プロパティ(または特別なプロパティであるインデクサー)は実際にはメソッドであり、メソッドへの参照はデリゲートであるため、答えはノーです。

    だから、 Action<T> を使用できます  あなたのコードは次のようになります(テストされたコードではありません):

    readonly Dictionary<string, int> dictionary = ...;
    Action<int> v = (x) => dictionary["foo"] = x;
    v(42);
    
    

あなたの答え