Можно ли объявить производную или реализованную часть IEnumerable интерфейса или класса устаревшим, тогда как остальная часть класса или интерфейса по-прежнему актуальна? Как я объявляю это?Объявить реализованный IEnumerable интерфейса или класса как устаревшего
interface Foo : IEnumerable<Bar>{
int SomethingNonObsolete{
get;
}
}
В приведенном выше examble, хотелось бы, что использование итераторы реализованного IEnumerable приводит к компилятору устаревших предупреждениям, тогда как использование интерфейса itselfs или использование SomethingNonObsolete
-свойства не приводит к такое предупреждение.
Следующий код должен привести к компилятором устаревшие предупреждения
foreach(var bar in myFooImplementingInstance){
Следующий код не должно привести к компилятором устаревшие предупреждения
myFooImplementingInstance.SomethingNonObsolete.ToString()
UPDATE
Потому что есть много ответов, но каждый ответ касается только па rt проблемы, здесь резюме и окончательный отчет:
В конце концов, это технически невозможно из-за LINQ.
Если кто-то будет использовать его в любом случае, как показывает Панда в его ответе, это легко сделать для занятий. Объявите счетчики как устаревшие и ваши штрафы.
[Obsolete]
IEnumerator<Bar> GetEnumerator()
[Obsolete]
IEnumerator IEnumerable.GetEnumerator()
Для интерфейсов это можно сделать аналогичным образом, как отмечает Божидар в комментарии. Объявите перечислитель новым ключевым словом и отметьте его как устаревший.
[Obsolete]
new IEnumerator<ITabularDataRow> GetEnumerator();
Однако, в то время как обе эти версии делают в общем то, что они должны, они оба разрыва при использовании LINQ. Таким образом, ответ кажется, что это невозможно в комплексном виде и что это в большинстве случаев полезно (см. Ответ и комментарии от MDeSchaepmeester).
Итак, вы в основном хотите удалить интерфейс из своего API? Почему бы не создать новый класс, который не реализует интерфейс? – HimBromBeere
Нет, я хочу удалить IEnumerable из интерфейса, но в настоящее время я не могу этого сделать, потому что многие приложения полагаются на интерфейс. Я хочу запретить разработчикам использовать foreach в IENumerable в новом коде, чтобы в будущем его было легче удалить, и у нас еще нет ссылок. – HCL
Существует способ сделать это с помощью ** точных ** примеров кода в вашем вопросе, но простой перевод в 'IEnumerable' или' IEnumerable 'будет * not * помечен как устаревший и не будет перечислить его. Короче говоря, это не решит все ваши проблемы. –