将"nameof"关键字与set-only属性一起使用

Sam*_*Sam 5 c# getter visual-studio c#-6.0 nameof

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

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

private void InitConnections(IMediaPanel panelControl)
{
    // Initialization logic
}
Run Code Online (Sandbox Code Playgroud)

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

nameof(IMediaPanel.IsListsAreaVisible)
Run Code Online (Sandbox Code Playgroud)

这工作正常,但使用此表达式:

nameof(IMediaPanel.IsNextEntityExists)
Run Code Online (Sandbox Code Playgroud)

Visual Studio向我显示以下错误:

属性"MyNamespace.IMediaPanel.IsNextEntityExists"没有getter.

搜索"名称限制"并没有给我任何关于这个问题的答案,而且官方评论不包含对财产获取者的限制:

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

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

更新

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

public void Init(FrameworkElement panelControl)
{
    // ... Other logic ...
    this.InitConnections((IMediaPanel) panelControl);
}
Run Code Online (Sandbox Code Playgroud)

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

无论如何,我找到了答案,这个'getter'错误是ReSharper的错误(参见我自己的回答).

Sam*_*Sam 5

结果发现了一个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团队提交错误时,我在他们的跟踪器中发现了一个非常类似的问题.它是关于类成员属性的,但是它给了我与我的界面相同的错误,所以我相信这是同样的错误.据说它将在ReSharper 10.1中修复.