我正在使用与C#中的一个COM接口在同一名称空间中声明的枚举。
当我在Hyper Vee中查看函数和对象browswer中的枚举时,枚举列在COM接口下面,但是其中的所有常量都将枚举名称添加为它的前缀。
ex: Enum = enumname Const = enumname_constantname where i want the Const to be only = constantname
我之前没有在VEE中看过这个,有人知道为什么会这样吗?我在C#代码中声明了什么问题吗?
public enum EnumName
{
constantName1,
constantName2
};
public interface InterfaceName
{
}
结果是VEE中显示的常量显示为EnumName_constantName1等...
答案 0 :(得分:3)
不,这是由于.NET枚举类型与C和C ++等语言中的 enum 关键字之间存在显着的不兼容性。这些语言将枚举成员添加到全局名称空间。这实际上是一个很大的问题,它通常会强制您在枚举成员名称上加上前缀,这样它们就不会与其他标识符冲突。就像您在代码段中使用的“常量”一样。
最近批准的新C ++语言标准(C ++ 11)实际上已使用新的枚举类关键字解决了此问题。其工作方式与.NET枚举相同,它们需要以其枚举类型名称为前缀。巧合的是,6年前C ++ / CLI使用的语法完全相同。这可能不是偶然的。
类型库导出器可以做任何合理的事情。但是枚举成员的前缀是其类型名称。就是你所看到的,“EnumName_constantName1”。不这样做会调用标识符名称冲突的恐怖。
但是看看光明的一面,你不再需要使用那个丑陋的“常量”前缀。客户端代码现在可以使用“EnumName_Name1”。如果您确实需要修复此问题,那么您可以使用oleview.exe程序将类型库反编译为.idl。编辑typedef并使用midl.exe将其编译回.tlb。否则是一件痛苦的事情。