【发布时间】:2018-11-04 17:08:17
【问题描述】:
我想知道是否可以在(字典)索引器或定义 set 和 get 访问器的属性上使用 C# 的 ref return,例如:
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 功能(不使用反射)?如果有,怎么做?
我知道,从这个意义上说,错误消息很清楚 - 但是,我想知道哪种方法是实现其语义的最佳方式。
【问题讨论】:
-
由于您实际上希望以延迟方式传递 setter,如果您的接口支持,您可以使用
Action<int>委托。 -
@TimSchmelter:我编辑了问题:我想知道如何实现 sematics 的实现
-
如果您想专门使用内置的
Dictionary执行此操作 - 您必须稍等片刻才能实现:github.com/dotnet/corefx/issues/20684 -
ref 在运行时被实现为指针。指针需要一个内存位置来指向。因此,属性或索引器永远无法限定,它们是方法而不是内存位置。对于普通方法参数,与 C# v1.0 ref syntax 没有其他区别,您也不能为参数传递属性或索引器。
-
@HansPassant 现在不完全正确,因为包括属性在内的方法现在可以通过引用返回值,因此某些属性(
ref Something类型)可以传递给期望ref参数的方法对应的类型。