如何在VB.NET中使用过时的方法实现接口而不抑制警告?

时间:2018-10-12 14:32:03

标签: vb.net interface obsolete

我有一个接口I,并且我刚刚决定弃用方法OldMethod(因为它的名称不正确,因为我想要附加参数,所以要给它命名),并建议我的图书馆用户使用改为NewMethod。因此,我将I扩展如下:

Interface I
    <Obsolete("Use NewMethod instead.")>
    Sub OldMethod()
    Sub NewMethod()
End Interface

但是,现在我所有的类实现 I都收到了编译器警告:

Class C
    Implements I

    ' The following line yields warning BC40000 
    Public Sub OldMethod() Implements I.OldMethod
        Throw New NotImplementedException()
    End Sub

    Public Sub NewMethod() Implements I.NewMethod
        Throw New NotImplementedException()
    End Sub
End Class

这对我来说没有意义:要实施I(总体上来说,不是已过时),我 必须实施{ {1}}。 C#中的相应代码可以完美编译,并且不会产生警告:

OldMethod

我知道我可以suppress the warning in VB,但是通常情况下,编译器警告指示您正在执行不应以这种方式执行的操作。

如何在VB.NET中实现具有过时成员的接口,而不会收到过时警告?

1 个答案:

答案 0 :(得分:2)

从我的评论中充实这个答案。

实现类必须实现Obsolete成员以履行合同,但是当接口方法标记为Obsolete时,您也必须将相应的方法标记为Obsolete,以使编译器确信不使用Obsolete成员的实现。

Public Interface I
    <Obsolete("Use NewMethod instead.")>
    Sub OldMethod() 
    Sub NewMethod()
End Interface

Public Class C
    Implements I

    <Obsolete("Use NewMethod instead.")>
    Public Sub OldMethod() Implements I.OldMethod ' No warning
        Throw New NotImplementedException()
    End Sub

    Public Sub NewMethod() Implements I.NewMethod
        Throw New NotImplementedException()
    End Sub
End Class

尽管与该特定问题并不完全相关,但在研究过程中,我发现此blog post by Grant Winney解释了为什么在接口成员本身(以及实现成员)上标记过时的成员是一个好主意