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