【问题标题】:Is it possible to pass a property as a ref parameter in a setter? c# (avoid "a property or indexer may not be passed as an out or ref parameter".)是否可以在 setter 中将属性作为 ref 参数传递? c#(避免“属性或索引器不能作为 out 或 ref 参数传递”。)
【发布时间】:2020-11-26 12:14:17
【问题描述】:

我有这个代码:

private int _someProperty;
public int SomeProperty
{
    get => _someProperty;
    set => SetProperty(ref _someProperty, value);
}

private void SetProperty<T>(ref T field, T value)
{
    if (!field.Equals(value))
    {
        field = value;
    }
}

我需要SetProperty&lt;T&gt;,因为我需要在具有大量属性的大类中设置逻辑,并且该逻辑适用于所有属性。 该代码适用于 _someProperty 是一个变量的情况。但在我的情况下,它不起作用,因为我引用了嵌套类的另一个属性,所以我收到编译错误:“属性或索引器可能不会作为 out 或 ref 参数传递”。

由于属性是底层的方法,我尝试了类似的方法:

private setProperty<T>(ref Action<T> property, T value) {
    //meaningful code
}

但我还是得到了编译错误。

有没有直接的方法通过引用传递属性以某种方式直接解决这个问题?

【问题讨论】:

  • Related 实现。
  • 非常有用,谢谢

标签: c# properties


【解决方案1】:

基本上没有。

存在关于可变 ref-returning get-only 属性的潜在漏洞,但这可能对您没有帮助,因为:

  1. 你不能在一个可变的 ref-returning get-only 属性中设置任何逻辑
  2. 这是一个荒谬的小众场景,大多数开发者不知道存在,也永远不需要使用 :)

【讨论】:

  • @TheGeneral 只是被警告:你不能看不见。由您选择:gist.github.com/mgravell/c46a1de553abe325dea0c44ac7fa7766 - 请注意,这不是该语言功能的常用用法,因为在这种情况下,它与直接公开该字段几乎相同。更典型的用法可能是享元,或提供对数组/等内的值的受控访问(按引用);如果它当时存在,ArraySegment&lt;T&gt; 可能会有一个索引器public ref T this[int index] =&gt; ref Array[Offset + index];,例如
  • @TheGeneral 什么是真的有趣;您是否知道实际上有一个 foreach 语法用于自定义迭代器,其 ref-return 为 .Current,它允许您改变 foreach 迭代变量(通常引发 CS1656)? gist.github.com/mgravell/db3e63c2f8cea1866a6aaade7507fa18
  • 哈哈酷,这很有趣。如果我可以再次投票,我会
  • 你可以在 c# 的黑暗博客之后做一个仅限成年人的博客,第二个似乎是通往良性错误小镇的单向街道。不过我喜欢!
猜你喜欢
  • 2011-05-29
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 2011-06-16
  • 2012-09-08
相关资源
最近更新 更多