CA1402:避免在 COM 可见接口中进行重载
类型名 |
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);
Visual Basic 6 COM 客户端无法实现名称中带有下划线的接口方法。
如何解决冲突
要修复与该规则的冲突,请重命名重载的方法,并使名称保持唯一。 或者,通过以下方法使该接口对 COM 不可见:将可访问性更改为 internal(在 Visual Basic 中为 Friend),或者应用设置为 false 的 System.Runtime.InteropServices.ComVisibleAttribute 特性。
何时禁止显示警告
不要禁止显示此规则发出的警告。
示例
下面的示例演示一个与该规则冲突的接口和一个满足该规则的接口。
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);
}
}
相关规则
CA1017:用 ComVisibleAttribute 标记程序集