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

Hei*_*nzi 5 vb.net interface obsolete

我有一个 interface I,我刚刚决定弃用方法OldMethod(因为它的名字很糟糕,因为我想要额外的参数,你命名它)并建议我的库的用户NewMethod改用。因此,我扩展I如下:

Interface I
    <Obsolete("Use NewMethod instead.")>
    Sub OldMethod()
    Sub NewMethod()
End Interface
Run Code Online (Sandbox Code Playgroud)

但是,现在我实现的 所有类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
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义:要实现I(作为一个整体,它并没有过时),我需要实现OldMethod. C# 中的相应代码编译得很好并且不会产生警告:

interface I
{
    [Obsolete("Use NewMethod instead.")]
    void OldMethod();
    void NewMethod();
}

class Explicit : I
{
    public void NewMethod() { throw new NotImplementedException(); }
    public void OldMethod() { throw new NotImplementedException(); }
}

class Implicit : I
{
    void I.NewMethod() { throw new NotImplementedException(); }
    void I.OldMethod() { throw new NotImplementedException(); }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以在 VB 中取消警告,但是,通常情况下,编译器警告表明您正在做一些不应该以这种方式完成的事情。

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

A F*_*end 4

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

实现类必须实现该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
Run Code Online (Sandbox Code Playgroud)

虽然与这个特定问题并不完全相关,但在研究时我发现了Grant Winney 的这篇博客文章,解释了为什么在接口成员本身(以及实现成员)上标记过时的成员是一个好主意