Свойства переименовываются, когда их имя совпадает с типом данных, который они возвращают

Я сталкиваюсь со следующей проблемой:

Мои интерфейсы определены в C#. Я использую пользовательские перечисления в моих интерфейсах. Некоторые перечисления имеют то же имя, что и возвращаемый тип данных, например:

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

Я использую tlbexp, чтобы использовать модуль в C++. Свойства, которые имеют свое имя и тип данных, переименовываются из "Имя" в "_Name":

Bar myEnumValue = pFoo-> Bar // не существует

Bar myEnumValue = pFoo->_Bar // это мое свойство 'Bar'

До сих пор я не нашел никакой документации о причине и если / как я могу предотвратить это. Я не получаю никаких предупреждений во время сборки или экспорта. Чтобы сделать использование моего модуля интуитивно понятным, я не хочу переименовывать свойство или перечисление.

Может кто-нибудь объяснить мне, почему это происходит?

1 ответ

Решение

В C++ это не разрешено:

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

потому что [basic.scope.class] 3.3.7/1:

Имя N, используемое в классе S, должно относиться к тому же объявлению в его контексте и при повторной оценке в завершенной области действия S. Для нарушения этого правила не требуется диагностика.


Обратите внимание, что это относится только к объявлениям внутри класса, для области имен или области функций правила более сложны - иногда B B; разрешено, иногда нет.


Обновление: на самом деле это совершенно верно:

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

Таким образом, вы можете попытаться сделать tlbexp генерировать код, как это.

Другие вопросы по тегам