Это связано с тем, как работает GObject и его соглашениями по присвоению имен.Руководство GObject содержит более подробную информацию , поэтому я не буду вдаваться в подробности ...
Когда вы создаете объект, давайте назовем его Foo
, в Vala, вВ сгенерированном C будут созданы две структуры: Foo
и FooClass
.Первый - это то, что люди чаще всего используют в API, и представляет собой экземпляр Foo
, тогда как последний используется для хранения информации о самом классе Foo
;виртуальные указатели на функции - это большая вещь.
Итак, с вашим кодом выше, сгенерированный код будет содержать Test
и TestClass
для внешнего класса и TestTestClass
и TestTestClassClass
для внутреннего класса.,Как только вы раскомментируете оставшуюся часть кода, он попытается сгенерировать TestClass
и TestClassClass
, первый из которых будет конфликтовать со структурой *Class
для уже существующего внешнего класса.
Вы можетенемного проще воспроизвести проблему с помощью:
public class Test : GLib.Object { }
public class TestClass : GLib.Object { }
В принципе, не вызывайте класс *Class
.