在(字典)索引器上使用C#的ref功能

时间:2018-05-25 10:15:02

标签: c# ref

我想知道是否可以在(字典)索引器或定义ref returnset访问器的属性上使用C#' 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 :(得分:6)

这需要类型实现索引器到提供程序ref - 在索引器中返回,所以no:你不能将它与{{1一起使用}}。但是有这样的事情:

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 indexer访问,即

ref var val = ref dictionary[key];

(数组中的索引器访问由编译器实现,而不是类型)

答案 1 :(得分:0)

答案是否定的,因为属性(或索引器,它们是特殊属性)are actually methodsa ref to a method is a delegate

So you can use Action<T>您的代码变为(未经过测试的代码):

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