为什么VB.NET编译器会认为接口未被实现,即使已经实现了?

5

更新

我认为我最初发布这个问题时没有表述清楚。

看一下这些截图。

alt text (此处链接到更大的屏幕截图)

请注意,我用红色框起来的部分。在此处显示的类确实实现了INotifyPropertyChanged,但是VB编译器似乎认为所声明的PropertyChanged事件与INotifyPropertyChanged.PropertyChanged的签名不匹配。

alt text (此处链接到更大的屏幕截图)

在这里我选择了有问题的代码行。在这张截图和下一张截图之间,我只是简单地 剪切并粘贴了同一行代码回到文件中(即,我按下Ctrl + X然后按下Ctrl + V)。

alt text (此处链接到更大的屏幕截图)

现在看!在剪切并粘贴该行代码后,错误消失了。

这里到底发生了什么?


原始问题

我有时会遇到这种情况,特别是在我的经验中使用INotifyPropertyChanged接口,但我不知道问题是否局限于该单个接口(这似乎很奇怪)。

假设我设置了这样的代码。有一个具有单个事件的接口。一个类实现了该接口。它包括事件。

Public Interface INotifyPropertyChanged
    Event PropertyChanged As PropertyChangedEventHandler
End Interface

Public Class Person
    Implements INotifyPropertyChanged

    Public Event PropertyChanged _
    (ByVal sender As Object, ByVal e As PropertyChangedEventArgs) _
        Implements INotifyPropertyChanged.PropertyChanged

    ' more code below '
End Class

有时候,在我构建项目的时候,编译器会突然表现出以上代码有问题。它会报告说 Person 类没有实现 INotifyPropertyChanged 接口,因为它没有 PropertyChanged 事件; 或者它会说 PropertyChanged 事件无法实现 INotifyPropertyChanged.PropertyChanged 接口,因为它们的签名不匹配。

这已经很奇怪了,但最奇怪的部分在于:如果我只是剪切掉以 Event PropertyChanged 开头的那行代码,然后把它粘贴回来,错误就消失了。整个项目都能成功构建。

有人知道发生了什么吗?


只是想更新一下。我经常遇到这个 bug。很多时候,当我使用剪切和粘贴移动类时,接口的事件会“断掉”:我同时得到一个“x 必须实现”和一个“y 无法实现...”。我再次剪切和粘贴,一切都顺利了。有时,当我使用 devXpress 的 CodeRush 工具的“将类型移动到文件”功能时,我也会遇到同样的 bug。有时我会遇到其他相关现象,比如幽灵类,一旦重新构建项目就会消失。Bug,我告诉你 :-) - M.A. Hanin
2个回答

2

这段代码在我的环境中(Visual Studio 2008)可以正常工作,你可能遇到了一些错误。

不过,你也可以按照以下方式实现:

Public Class Person
    Implements INotifyPropertyChanged

    Public Event PropertyChanged As PropertyChangedEventHandler _
        Implements INotifyPropertyChanged.PropertyChanged

End Class

我认为你是对的,这是一个bug。我想我会向微软的VB.NET团队报告它。 - Dan Tao
1
这个问题在微软连接上报告了吗?如果是的话,链接是什么?我想点赞它,因为我们经常遇到这种情况。 - adam0101

1

你需要将事件标记为公共


抱歉,那是我的错,因为我没有复制和粘贴样板代码。该事件在类中是“公共的”。就像我说的那样,将该行代码剪切并粘贴回去可以消除错误(并且项目可以构建)。 - Dan Tao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接