我有一个接口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中抑制警告 ,但是,通常,编译器警告表明您正在做一些不应该以这种方式完成的事情。

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

#1楼 票数: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

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

  ask by Heinzi translate from so

未解决问题?本站智能推荐:

1回复

抑制vb.net中工厂方法过时的警告

是否可以防止由静态工厂方法返回过时类的实例引起的编译器警告? 例如,如果通过静态方法(创建)创建了过时类(Foo)的实例,则工厂方法会引起编译器警告。 在C#中,可以使用“ #pragma warning ...”来抑制该警告,但我认为VB.Net中不存在该警告。 由于业务需求,不能选
3回复

在VB.NET中抑制过时的警告

我使用过时的方法在Visual Studio 2008中使用VB.NET代码,并希望禁止警告。 不幸的是,遵循该建议并不是一个好的解决方案,因为它需要使用不同的类,这在不同的方面有重要作用。 我试图使用System.Diagnostics.CodeAnalysis.SuppressMess
1回复

如何在我无法控制的装配中标记类型或成员过时?

示例:我的同事应该不再使用Microsoft.VisualBasic.Collection ,我希望构建过程应该指向替换类型。 这听起来像是ObsoleteAttribute的情况,除了我无法在Microsoft.VisualBasic.Collection设置属性。 有没有办法实现这样的事
1回复

为什么一个项目提供“过时”警告,而另一个项目没有?

我有两个非常相似的vb.net项目。 两者最近都已从.net 1.1转换为3.5。 在一个中,以下代码不提供警告。 另一方面,当我尝试设置mysql命令对象的参数时,我收到警告: 这是警告: 公共函数Add(parameterName As String,value As Ob
3回复

在vb.net中使用私有方法实现接口

我对此感到震惊。 有人可以解释为什么这有效吗? 何时使用它的一个很好的例子也很好。
1回复

在VB.NET中使用单个属性实现多个接口

在启动时,我将所有app.config值加载到名为ConfigValues的类中。 我的数据库只需要其中一些,所以我有一个IDatabaseConfig接口,只指定它需要的参数。 这样,当我使用构造函数注入创建数据库连接类时,我可以要求它传递任何实现IDatabaseConfig东西。
1回复

接口方法使用ByRef和VB.NET实现和传递

我有一个C#接口定义如下: 我需要在VB.NET类中实现这个接口。 当我使用ByVal传递的items参数实现SetSecurityFlags方法时,它会编译。 当我尝试使用ByRef传递的items参数实现它时,我得到以下编译器错误: 类'UserRights'必须实现'Sub
2回复

如何在VB.NET中使用隐式实现创建接口

在C#中,我可以创建一个接口,当我使用该接口时,编译器知道基类满足某些接口要求。 通过一个例子可能更清楚: 编译器知道Hide()和Show()是在Form中实现的,上面的代码编译得很好。 我无法弄清楚如何在VB.NET中这样做。 当我尝试: 但编译器抱怨Form1必须为接口'Fo