Поделиться через


ЭкспериментальныйАтрибут

Заметка

Эта статья является спецификацией компонентов. Спецификация служит проектным документом для функции. Она включает предлагаемые изменения спецификации, а также информацию, необходимую во время дизайна и разработки функции. Эти статьи публикуются до тех пор, пока предложенные изменения спецификации не будут завершены и включены в текущую спецификацию ECMA.

Может возникнуть некоторое несоответствие между спецификацией компонентов и завершенной реализацией. Эти различия отражены в соответствующих записях собрания по проектированию языка (LDM) .

Дополнительные сведения о процессе внедрения спецификаций функций в стандарт языка C# см. в статье о спецификациях .

Сообщайте предупреждения о ссылках на типы и элементы, отмеченные System.Diagnostics.CodeAnalysis.ExperimentalAttribute.

namespace System.Diagnostics.CodeAnalysis
{
    [AttributeUsage(AttributeTargets.Assembly |
                    AttributeTargets.Module |
                    AttributeTargets.Class |
                    AttributeTargets.Struct |
                    AttributeTargets.Enum |
                    AttributeTargets.Constructor |
                    AttributeTargets.Method |
                    AttributeTargets.Property |
                    AttributeTargets.Field |
                    AttributeTargets.Event |
                    AttributeTargets.Interface |
                    AttributeTargets.Delegate, Inherited = false)]
    public sealed class ExperimentalAttribute : Attribute
    {
        public ExperimentalAttribute(string diagnosticId)
        {
            DiagnosticId = diagnosticId;
        }

        public string DiagnosticId { get; }
        public string? UrlFormat { get; set; }
        public string? Message { get; set; }
    }
}

Сообщаемая диагностика

Хотя диагностика технически является предупреждением, поэтому компилятор позволяет подавлять его, он рассматривается как ошибка для создания отчетов. Это приводит к сбою сборки, если диагностика не подавляется.

Диагностика сообщается для любой ссылки на тип или элемент, который является одним из следующих:

  • помечен атрибутом,
  • в сборке или модуле, помеченном атрибутом,

за исключением случаев, когда ссылка возникает в элементах [Experimental], она автоматически подавляется.

Также можно отключить диагностику обычными средствами, например явным параметром компилятора или #pragma.
Например, если API помечен как [Experimental("DiagID")] или [Experimental("DiagID", UrlFormat = "https://example.org/{0}")], диагностику можно отключить с помощью #pragma warning disable DiagID.

Ошибка возникает, если идентификатор диагностики, заданный экспериментальным атрибутом, не является допустимым идентификатором C#.

Если значение свойства Message не указано, диагностическое сообщение будет специальным сообщением, в котором '{0}' является полностью квалифицированным именем типа или члена.

'{0}' is for evaluation purposes only and is subject to change or removal in future updates.

Если для свойства Message задано значение, то диагностическое сообщение становится конкретным сообщением, в котором '{0}' является полным именем типа или члена, а '{1}' представляет собой Message.

'{0}' is for evaluation purposes only and is subject to change or removal in future updates: '{1}'.

Атрибут не наследуется от базовых типов или переопределенных элементов.

Устаревшая и нерекомендуемаяAttribute

Предупреждения для [Experimental] сообщаются в [Obsolete] или [Deprecated] членах.
Предупреждения и ошибки для [Obsolete] и [Deprecated] сообщаются членами [Experimental].
Но предупреждения и ошибки для [Obsolete] и [Deprecated] сообщаются вместо [Experimental], если существует несколько атрибутов.