【问题标题】:Using "nameof" keyword with set-only property将“nameof”关键字与仅设置属性一起使用
【发布时间】:2016-06-18 00:22:20
【问题描述】:

在我的函数中,我收到实现IMediaPanel 接口的对象:

public interface IMediaPanel
{
    bool IsListsAreaVisible { get; }
    bool IsNextEntityExists { set; }
}

private void InitConnections(IMediaPanel panelControl)
{
    // Initialization logic
}

在初始化期间,我需要指定属性的名称,为此我使用 C# 6.0 nameof 关键字:

nameof(IMediaPanel.IsListsAreaVisible)

这很好用,但是用这个表达式:

nameof(IMediaPanel.IsNextEntityExists)

Visual Studio 显示以下错误:

“MyNamespace.IMediaPanel.IsNextEntityExists”属性没有 getter。

搜索“限制名称”并没有给我任何关于这个问题的答案,而且官方评论中没有包含关于property getters的限制:

... 以下是值得一提的产生错误的类型:预定义类型(例如,int 或 void)、可空类型(Point?)、数组类型(Customer[,])、指针类型(Buffer*)、限定别名 (A::B)、未绑定的泛型类型 (Dictionary)、预处理符号 (DEBUG) 和标签 (loop:)。 ...

谁能解释为什么会有这个限制,是否有任何参考?什么原因可以强制nameof 关键字使用属性的实例获取器,而它应该(我猜)只是通过反射使用一般类型信息? (至少在这种特殊情况下,当我由于未知类型而无法直接指向实例的属性时,我只知道该实例实现接口)

更新

为了解释为什么 @Gusdor 的 cmets 建议不起作用,我需要澄清我如何调用 InitConnections 函数(简化形式):

public void Init(FrameworkElement panelControl)
{
    // ... Other logic ...
    this.InitConnections((IMediaPanel) panelControl);
}

因此,如果我在 Init 函数中使用 nameof(panelControl.IsNextEntityExists),则会产生错误,因为 FrameworkElement 不包含自定义客户端的 IsNextEntityExists 属性。 如果我在 InitConnections 函数中使用相同的表达式,我会收到关于 getter 的错误 - 与 nameof(IMediaPanel.IsNextEntityExists) 相同。

无论如何,我找到了答案,这个“getter”错误是 ReSharper 的错误(请参阅我自己的答案)。

【问题讨论】:

  • nameof(panelControl.IsNextEntityExists) 工作吗?
  • 我无法重现这个 - 你的 exact 代码对我来说很好用。可以发minimal reproducible example吗?
  • @Gusdor 不,因为我收到的panelControlFrameworkElement。物理上它只是自定义UserControl,由使用我的公共控件的客户端创建。每个客户端都创建自己的用户控件并将其传递给我,因此我们通过接口进行通信。
  • 我很困惑,您的 init 方法采用 IMediaPanel 并且您声明在 init 期间需要名称 - “在初始化期间我需要指定属性名称”
  • @Sam:我什至不在 Visual Studio 中 - 只是从命令行编译 :)

标签: c# visual-studio getter c#-6.0 nameof


【解决方案1】:

原来是一个 ReSharper 错误,至少在 ReSharper 暂停时没有显示错误(工具 -> 选项 -> ReSharper Ultimate -> 立即暂停),即使在 Visual Studio 中显示错误,项目也可以成功编译。

我目前的版本是:

  • JetBrains ReSharper Ultimate 10.0.2 Build 104.0.20151218.120627 (ReSharper 10.0.20151218.130009)
  • Visual Studio 14.0.24720.0

更新

当我在搜索如何向 ReSharper 团队提交错误时,我在他们的跟踪器中发现了一个非常相似的 issue。它是关于类成员属性的,但它给了我与我的接口相同的错误,所以我相信这是同一个错误。那里说它将在 ReSharper 10.1 中修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2015-08-24
    相关资源
    最近更新 更多