将 "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 中修复。
在我的函数中,我接收到实现 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 中修复。