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

How do I implement an interface with an obsolete method in VB.NET without suppressing warnings?

我有一个接口 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(作为一个整体,不会 过时),我 需要 实施 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(); }
}

我知道我可以 ,但是,编译器警告通常表明您正在做一些不应该以那种方式做的事情。

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

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

实现class必须实现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 解释了为什么在接口成员本身(以及实现成员)上标记过时成员是个好主意