CA1402: не используйте перегрузки в интерфейсах, видимых в COM

Товар Значение
Идентификатор правила CA1402
Категория Microsoft.Interoperability
Критическое изменение Критическое

Причина

Видимый интерфейс компонентной объектной модели (COM) объявляет перегруженные методы.

Описание правила

Когда перегруженные методы предоставляются клиентам COM, сохраняется имя только первой перегрузки метода. Последующие перегрузки однозначно переименовываются путем добавления к имени символа подчеркивания "_" и целого числа, соответствующего порядку объявления перегрузки. Например, рассмотрим следующие методы:

void SomeMethod(int valueOne);
void SomeMethod(int valueOne, int valueTwo, int valueThree);
void SomeMethod(int valueOne, int valueTwo);

Эти методы предоставляются клиентам COM следующим образом.

void SomeMethod(int valueOne);
void SomeMethod_2(int valueOne, int valueTwo, int valueThree);
void SomeMethod_3(int valueOne, int valueTwo);

Клиенты COM Visual Basic 6 не могут реализовать методы интерфейса с помощью подчеркивания в имени.

Устранение нарушений

Чтобы устранить нарушение этого правила, переименуйте перегруженные методы таким образом, чтобы имена были уникальными. Кроме того, сделайте интерфейс невидимым для COM, изменив специальные возможности internal (Friend в Visual Basic) или применив набор атрибутов System.Runtime.InteropServices.ComVisibleAttribute к false.

Когда лучше отключить предупреждения

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере показан интерфейс, который нарушает правило и интерфейс, удовлетворяющий правилу.

using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   // This interface violates the rule.
   [ComVisible(true)]
   public interface IOverloadedInterface
   {
      void SomeMethod(int valueOne);
      void SomeMethod(int valueOne, int valueTwo);
   }

   // This interface satisfies the rule.
   [ComVisible(true)]
   public interface INotOverloadedInterface
   {
      void SomeMethod(int valueOne);
      void AnotherMethod(int valueOne, int valueTwo);
   }
}

CA1413: избегайте использования не открытых полей в видимых типах значений COM

CA1407: не используйте статические члены в видимых COM типах

CA1017: помечайте сборки атрибутом ComVisibleAttribute

См. также