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