CA1402: Überladungen in für COM sichtbaren Schnittstellen vermeiden
TypeName |
AvoidOverloadsInComVisibleInterfaces |
CheckId |
CA1402 |
Kategorie |
Microsoft.Interoperability |
Unterbrechende Änderung |
Breaking |
Ursache
Eine sichtbare Component Object Model (COM)-Schnittstelle deklariert überladene Methoden.
Regelbeschreibung
Wenn für COM-Clients überladene Methoden verfügbar gemacht werden, behält nur die erste Methodenüberladung ihren Namen. Nachfolgende Überladungen werden eindeutig umbenannt, indem dem Namen ein Unterstrich ('_') und eine ganze Zahl angefügt werden, die der Reihenfolge der Deklaration der Überladung entspricht. Betrachten Sie z. B. die folgenden Methoden:
void SomeMethod(int valueOne);
void SomeMethod(int valueOne, int valueTwo, int valueThree);
void SomeMethod(int valueOne, int valueTwo);
Diese Methoden werden COM-Clients wie folgt verfügbar gemacht.
void SomeMethod(int valueOne);
void SomeMethod_2(int valueOne, int valueTwo, int valueThree);
void SomeMethod_3(int valueOne, int valueTwo);
Visual Basic 6-COM-Clients können keine Schnittstellenmethoden mit einem Unterstrich im Namen implementieren.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, benennen Sie die überladenen Methoden um, sodass die Namen eindeutig sind. Sie können die Schnittstelle auch für COM sichtbar machen, indem Sie die Zugriffsart in internal ändern (Friend in Visual Basic) oder das auf false festgelegte System.Runtime.InteropServices.ComVisibleAttribute-Attribut übernehmen.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Beispiel
Das folgende Beispiel zeigt eine Schnittstelle, die gegen die Regel verstößt, und eine Schnittstelle, die der Regel entspricht.
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);
}
}
Verwandte Regeln
CA1413: Nicht öffentliche Felder in für COM sichtbaren Werttypen vermeiden
CA1407: Statische Member in für COM sichtbaren Typen vermeiden
CA1017: Assemblys mit ComVisibleAttribute markieren