Страницы

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

понедельник, 16 декабря 2019 г.

Аттрибут Obsolete

#c_sharp #net


Коллеги, кто может подсказать, почему билд не пададет при использовании метода помеченного так:
(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
    


Ответы

Ответ 1



кхм... 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()" И данный атрибут просто игнорируется в дальнейшем, несмотря на явное указание генерировать ошибку. Не претендую на истину, но имею большие основания полагать, что в данном случае студия ведет себя корректно, потому что такой прием по сути равноценен попытке понизить уровень доступа в классе наследнике, а это нарушение принципа строго расширяющего наследования в ООП. Так что либо нужно помечать устаревшим метод базового класса, что в вашем случае невозможно, либо применить другой способ изоляции, например инкапсулировать объект класса-наследника в класс-оболочку, в которой предоставить только нужные методы, но сам класс-оболочка не должен наследоваться ни от базового, ни от производного, проблемных классов.

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

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