CA1402: не используйте перегрузки в интерфейсах, видимых в COM
TypeName |
AvoidOverloadsInComVisibleInterfaces |
CheckId |
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) или присвоив атрибуту ComVisibleAttribute значение false.
Отключение предупреждений
Для этого правила отключать вывод предупреждений не следует.
Пример
В следующем примере демонстрируется интерфейс, нарушающий описанное правило, а также интерфейс, выполняющий его.
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary
' This interface violates the rule.
<ComVisibleAttribute(True)> _
Public Interface IOverloadedInterface
Sub SomeSub(valueOne As Integer)
Sub SomeSub(valueOne As Integer, valueTwo As Integer)
End Interface
' This interface satisfies the rule.
<ComVisibleAttribute(True)> _
Public Interface INotOverloadedInterface
Sub SomeSub(valueOne As Integer)
Sub AnotherSub(valueOne As Integer, valueTwo As Integer)
End Interface
End Namespace
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
См. также
Ссылки
Тип данных Long (Visual Basic)