我想知道是否可以在(字典)索引器或定义ref return
和set
访问器的属性上使用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
功能(不使用反射)?如果是这样,怎么样?
<小时/> 我知道,错误信息在这个意义上是明确的 - 但是,我想知道哪个是实现其语义的最佳方式。
答案 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 methods和a 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);