IL3003: заметки "RequiresAssemblyFilesAttribute" должны соответствовать всем реализациям интерфейса или переопределениям
Значение | |
---|---|
Идентификатор правила | IL3003 |
Категория | SingleFile |
Исправление является критическим или неразрывным | Некритическое |
Причина
При публикации приложения в виде одного файла (например, путем задания PublishSingleFile
свойства true
в проекте), реализации интерфейса или производные классы с элементами, не имеющими соответствующие заметки [RequiresAssemblyFiles]
, могут привести к вызову члена с атрибутом, который не совместим с одним файлом. Существует четыре возможных сценария, где можно создать предупреждение:
Элемент базового класса имеет атрибут, но переопределяющий член производного класса не имеет атрибута:
public class Base { [RequiresAssemblyFiles] public virtual void TestMethod() {} } public class Derived : Base { // IL3003: Base member 'Base.TestMethod' with 'RequiresAssemblyFilesAttribute' has a derived member 'Derived.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute. public override void TestMethod() {} }
Элемент базового класса не имеет атрибута, но переопределяющий член производного класса имеет атрибут:
public class Base { public virtual void TestMethod() {} } public class Derived : Base { // IL3003: Member 'Derived.TestMethod()' with 'RequiresAssemblyFilesAttribute' overrides base member 'Base.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute. [RequiresAssemblyFiles] public override void TestMethod() {} }
Элемент интерфейса имеет атрибут, но его реализация не имеет атрибута:
interface IRAF { [RequiresAssemblyFiles] void TestMethod(); } class Implementation : IRAF { // IL3003: Interface member 'IRAF.TestMethod()' with 'RequiresAssemblyFilesAttribute' has an implementation member 'Implementation.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute. public void TestMethod () { } }
Элемент интерфейса не имеет атрибута, но его реализация имеет атрибут:
interface INoRAF { void TestMethod(); } class Implementation : INoRAF { [RequiresAssemblyFiles] // IL3003: Member 'Implementation.TestMethod()' with 'RequiresAssemblyFilesAttribute' implements interface member 'INoRAF.TestMethod()' without 'RequiresAssemblyFilesAttribute'. For all interfaces and overrides the implementation attribute must match the definition attribute. public void TestMethod () { } }
Устранение нарушений
Во всех интерфейсах и переопределениях наличие или отсутствие атрибута "RequiresAssemblyFilesAttribute" должно сохраняться как в реализации, так и в определении. Либо оба элемента должны содержать атрибут, либо ни один. Удалите или добавьте атрибут в интерфейс или элемент базового класса или в реализацию или элемент производного класса, чтобы атрибут содержался либо в обоих элементах, либо ни в одном.
Когда лучше отключить предупреждения
Не следует отключать это предупреждение.