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的错误(参见我自己的回答).
结果发现了一个ReSharper错误,至少在ReSharper被挂起时没有显示错误(工具 - >选项 - > ReSharper Ultimate - >暂停),即使Visual Studio中显示错误,项目也会成功编译.
我目前的版本是:
当我在搜索如何向ReSharper团队提交错误时,我在他们的跟踪器中发现了一个非常类似的问题.它是关于类成员属性的,但是它给了我与我的界面相同的错误,所以我相信这是同样的错误.据说它将在ReSharper 10.1中修复.
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |