Атрибут Obsolete проверяется только во время компиляции?

Интересно, что устаревший атрибут проверяется только во время выполнения?

Подумайте, что у вас есть две сборки. В сборке A используется метод из сборки B. После этого мы отмечаем метод в сборке B как устаревший, что приводит к ошибке времени компиляции при компиляции сборки A.

Пока нет проблем, но вопрос в том, продолжает ли прежняя сборка A работать с новой сборкой B или нет? Благодаря

Ответ 1

Это зависит от того, что вы делаете. Атрибут [Obsolete] предназначен в первую очередь для использования во время компиляции, но имейте в виду, что некоторые части среды выполнения имеют другое поведение, когда оно присутствует (см. Ниже). Он может вызвать проблемы даже в существующем коде, который не перестроен, поэтому мы должны заключить, что НЕТ, [Obsolete] не проверяется только во время компиляции.

Например, код ниже будет писать Foo, но не Bar:

using System;
using System.Xml.Serialization;
public class Data
{
    public int Foo { get; set; }
    [Obsolete] public int Bar {get;set;}

    static void Main()
    {
        var data = new Data { Foo = 1, Bar = 2 };
        new XmlSerializer(data.GetType()).Serialize(Console.Out, data);
    }
}

(XmlSerializer - тоже время выполнения - не часть компилятора)

Ответ 2

Построение сборки, использующей метод из другой сборки, которая помечена как "Устаревшая", вызывает предупреждение о времени компиляции (если у вас нет предупреждений "показывать предупреждения как ошибки" ).

Нет ничего, что мешало бы вам использовать этот метод, пока он остается в ссылочной сборке. Атрибут Obsolete существует как способ для разработчиков библиотеки позволить людям, которые используют библиотеку, знать, что они должны искать другой метод для достижения того, что им нужно.

Чтобы ответить на ваш вопрос, да, более старая сборка A продолжит работу с новой сборкой B. (при условии, что версия сборки остается прежней)