Использование функций ссылок C # в (словаре) индексаторах - PullRequest
0 голосов
/ 25 мая 2018

Мне было интересно, возможно ли использовать 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 ]

0 голосов
/ 25 мая 2018

Ответ - нет, потому что свойства (или индексаторы, которые являются специальными свойствами) на самом деле являются методами , а в качестве ссылки на метод является делегатом .

Таким образом, вы можете использовать Action<T>, и ваш код становится (не проверенный код):

readonly Dictionary<string, int> dictionary = ...;
Action<int> v = (x) => dictionary["foo"] = x;
v(42);
0 голосов
/ 25 мая 2018

Для этого требуется тип , реализующий индексатор для поставщика ref -turn в индексаторе , поэтому нет: вы не можете использовать его с 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 indexer, то есть

SomeMethod(ref arr[42]);

(доступ к индексаторам в массивах осуществляется компилятором, а не типом)

...