当属性的名称与返回的数据类型相同时,属性将被重命名

本文关键字:属性 重命名 数据类型 返回 | 更新日期: 2023-09-27 18:26:48

我面临以下问题:

我的接口是用C#定义的。我在接口中使用自定义枚举。有些枚举与返回的数据类型同名,例如:

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

我使用tlbexp来使用C++中的模块。将与其数据类型共享名称的属性从"重命名为";名称";至"_名称":

Bar myEnumValue=pFoo->条形码//不存在

Bar myEnumValue=pFoo-&gt_酒吧//是我的"酒吧"-属性

到目前为止,我没有找到任何关于原因以及我是否/如何能够防止这种情况发生的文件。我在生成或导出过程中没有收到任何警告。。为了直观地使用我的模块,我不想重命名属性或枚举。

有人能解释一下为什么会发生这种事吗?

当属性的名称与返回的数据类型相同时,属性将被重命名

在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生成这样的代码。