Страницы

Поиск по вопросам

суббота, 27 октября 2018 г.

Аттрибут Obsolete

Коллеги, кто может подсказать, почему билд не пададет при использовании метода помеченного так: (Infastructure.csproj)
[Obsolete("blah blah blah", true)] public override int SaveChanges()
Метод располагается в Class Lib, вызываю в консольке. Для методов помеченых атрибутом в консольке билд ломается... Вызов такой (TestApp.csproj):
var ctx = new TestContext(); ctx.TestType.Add(new TestType { Value = "qwe" }); ctx.SaveChanges();
Переезд проекта в другую студию так же не помог.
Ссылка на Solution


Ответ

кхм... MSDN на эту тему молчит, но опытным путем удалось выяснить следующее:
Допустим имеем такую примитивную иерархию классов
class A { public virtual void foo() { } }
class B : A { [Obsolete("don't use it", true)] public override void foo() { } }
Тогда возникает Warning
Предупреждение CS0809 Член с атрибутом "obsolete" "B.foo()" переопределяет член без атрибута "obsolete" "A.foo()"
И данный атрибут просто игнорируется в дальнейшем, несмотря на явное указание генерировать ошибку.
Не претендую на истину, но имею большие основания полагать, что в данном случае студия ведет себя корректно, потому что такой прием по сути равноценен попытке понизить уровень доступа в классе наследнике, а это нарушение принципа строго расширяющего наследования в ООП. Так что либо нужно помечать устаревшим метод базового класса, что в вашем случае невозможно, либо применить другой способ изоляции, например инкапсулировать объект класса-наследника в класс-оболочку, в которой предоставить только нужные методы, но сам класс-оболочка не должен наследоваться ни от базового, ни от производного, проблемных классов.

Комментариев нет:

Отправить комментарий