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