当属性的名称与它们返回的数据类型相同时,属性会重命名

时间:2014-10-17 07:49:04

标签: c# c++ com com-interop tlbexp

我遇到以下问题:

我的界面是用C#定义的。我在界面中使用自定义枚举。一些枚举与它们返回的数据类型具有相同的名称,例如:

Foo Foo { get; }
Bar Bar { get; }

我使用tlbexp在C ++中使用该模块。 与其数据类型共享其名称的属性将从“名称”重命名为“_Name”:

  

Bar myEnumValue = pFoo-> Bar //不存在

     

Bar myEnumValue = pFoo-> _Bar //是我的'Bar'-Property

到目前为止,我没有找到任何关于原因以及是否/如何防止这种情况的文档。 在构建或导出期间,我没有收到任何警告。 为了直观地使用我的模块,我不想重命名属性或枚举。

任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

在C ++中,这是不允许的:

class B {};
class A {
    B B;
};

因为[basic.scope.class] 3.3.7/1

  

在类S中使用的名称N应在其上下文中引用相同的声明,并在完成的S范围内重新评估。违反此规则不需要诊断。


请注意,这仅适用于类中的声明,对于命名空间范围或函数范围规则更复杂 - 有时允许B B;,有时不允许。


更新:实际上这完全有效:

class B {};
class A {
    ::B B;
};

因此,您可以尝试让tlbexp生成这样的代码。