将 "nameof" 关键字与仅设置 属性 一起使用

Using "nameof" keyword with set-only property

在我的函数中,我接收到实现 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 显示以下错误:

The property 'MyNamespace.IMediaPanel.IsNextEntityExists' has no getter.

搜索"nameof limitations"没有给我关于这个问题的任何答案,而且官方的评论不包含对属性 getters[=51的限制=]:

... The following are worth mentioning that produce errors: predefined types (for example, int or void), nullable types (Point?), array types (Customer[,]), pointer types (Buffer*), qualified alias (A::B), and unbound generic types (Dictionary<,>), preprocessing symbols (DEBUG), and labels (loop:). ...

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

更新

为了解释为什么 @Gusdor 的评论建议不起作用,我需要澄清我如何调用 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 的错误(参见我自己的答案)。

原来是 ReSharper 错误,至少当 ReSharper 暂停时错误没有显示(工具 -> 选项 -> ReSharper Ultimate -> 立即暂停),项目成功编译,即使在 [=25 中显示错误=].

我当前的版本是:

  • JetBrains ReSharper Ultimate 10.0.2 内部版本 104.0.20151218.120627 (ReSharper 10.0.20151218.130009)
  • Visual Studio 14.0.24720.0

更新

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