CA1402 : Éviter les surcharges dans les interfaces COM visibles
TypeName |
AvoidOverloadsInComVisibleInterfaces |
CheckId |
CA1402 |
Catégorie |
Microsoft.Interoperability |
Modification avec rupture |
Oui |
Cause
Une interface COM (Component Object Model) visible déclare des méthodes surchargées.
Description de la règle
Lorsque les méthodes surchargées sont exposées aux clients COM, seule la première surcharge de méthode conserve son nom. Les surcharges suivantes sont renommées de manière unique par l'ajout d'un trait de soulignement '_' au nom et d'un entier qui correspond à l'ordre de déclaration de la surcharge. Prenons par exemple les méthodes suivantes.
void SomeMethod(int valueOne);
void SomeMethod(int valueOne, int valueTwo, int valueThree);
void SomeMethod(int valueOne, int valueTwo);
Ces méthodes sont exposées aux clients COM comme suit.
void SomeMethod(int valueOne);
void SomeMethod_2(int valueOne, int valueTwo, int valueThree);
void SomeMethod_3(int valueOne, int valueTwo);
Les clients COM Visual Basic 6 ne peuvent pas implémenter de méthodes d'interface avec un trait de soulignement dans le nom.
Comment corriger les violations
Pour corriger une violation de cette règle, renommez les méthodes surchargées afin que les noms soient uniques. Vous pouvez aussi rendre l'interface invisible à COM en remplaçant l'accessibilité par internal (Friend en Visual Basic) ou en appliquant l'ensemble d'attributs System.Runtime.InteropServices.ComVisibleAttribute avec la valeur false.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Exemple
L'exemple suivant présente une interface qui enfreint la règle et une autre qui satisfait la règle.
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);
}
}
Règles connexes
CA1413 : Éviter les champs non publics dans les types valeur visibles par COM
CA1407 : Éviter les membres statiques dans les types visibles par COM
CA1017 : Marquer les assemblys avec ComVisibleAttribute
Voir aussi
Référence
Long, type de données (Visual Basic)