使用" nameof"设置为

时间:2016-03-04 10:04:34

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

在我的函数中,我收到了实现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 的限制:

  

...以下值得一提的是产生错误:预定义类型(例如,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);
}

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

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

1 个答案:

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