【发布时间】:2016-06-15 11:26:47
【问题描述】:
是否可以将接口或类的派生或实现的 IEnumerable 部分声明为已过时,而类或接口的其余部分仍然是最新的?我该如何声明?
interface Foo : IEnumerable<Bar>{
int SomethingNonObsolete{
get;
}
}
在上面的示例中,我希望使用已实现的 IEnumerable 的迭代器会导致编译器过时警告,而使用接口本身或使用 SomethingNonObsolete-Property 不会导致这样的警告。
以下代码应导致编译器过时警告
foreach(var bar in myFooImplementingInstance){
以下代码不应导致编译器过时警告
myFooImplementingInstance.SomethingNonObsolete.ToString()
更新
因为答案很多,但每个答案都只涉及问题的一部分,这里做一个总结和最后陈述:
最后,由于 LINQ,这在技术上是不可能的。
如果有人会使用它,正如 Panda 在他的回答中所显示的那样,上课很容易。将枚举器声明为已过时并罚款。
[Obsolete]
IEnumerator<Bar> GetEnumerator()
[Obsolete]
IEnumerator IEnumerable.GetEnumerator()
对于接口,它可以以类似的方式完成,正如 Bozhidar 在评论中所说的那样。使用 new-keyword 声明枚举器并将其标记为过时。
[Obsolete]
new IEnumerator<ITabularDataRow> GetEnumerator();
然而,虽然这两个版本通常都做了它们应该做的事情,但它们在使用 LINQ 时都会中断。 因此,答案似乎是不可能以全面的方式进行,并且在大多数情况下这是好的(请参阅 MDeSchaepmeester 的答案和 cmets)。
【问题讨论】:
-
所以你基本上想从你的 API 中删除接口?为什么不创建一个不实现接口的新类?
-
不,我想从界面中删除 IEnumerable,但我目前无法这样做,因为许多应用程序都依赖于该界面。我想阻止开发人员在新代码中使用 IENumerable 上的 foreach,以便将来更容易删除,并且我们没有更多引用。
-
有一种方法可以使用您问题中的 exact 代码示例来执行此操作,但简单地转换为
IEnumerable或IEnumerable<Bar>将 not i> 被标记为已过时,也不会对其进行枚举。简而言之,这并不能解决您的所有问题。 -
@HCL 如果“许多应用程序依赖于接口”,将其标记为过时并不会削减它。您正在查看公共 API 中的巨大更改,并且您希望将其记录下来,而不是将某些内容标记为过时。
标签: c# compiler-warnings