Как преобразовать интерфейс VB.net с перечислением к C#

string path(getenv("WINDIR"));

поместит% WINDIR% в строку std ::. Я ожидаю, что вы можете сделать то же самое с типами Qt.

Возможно, вам лучше использовать стандартные пути Qt http://doc.qt.io/qt-5/qstandardpaths.html . Возиться с% WINDIR% немного опасно.

7
задан Joel Coehoorn 7 October 2008 в 14:18
поделиться

2 ответа

Короче говоря, Вы не можете изменить тот интерфейс, не взламывая код, потому что C# не может вложить типы в интерфейсах. При реализации интерфейса версий VB.NET Вы указываете, что Number возвратит тип MyInterface. MyEnum:

class TestClass3 : TestInterfaces.MyInterface
{

    TestInterfaces.MyInterface.MyEnum TestInterfaces.MyInterface.Number
    {
        get { throw new Exception("The method or operation is not implemented."); }
    }

}

Однако, так как C# не может вложить типы в интерфейсах при повреждении перечислителя из интерфейса Вы будете возвращать другой тип данных: в этом случае, MyEnum.

class TestClass2 : IMyInterface
{

    MyEnum IMyInterface.Number
    {
        get { throw new Exception("The method or operation is not implemented."); }
    }

}

Думайте об этом с помощью полностью определенного имени типа. В интерфейсе VB.NET у Вас есть тип возврата

MyProject. MyInterface. MyEnum

В интерфейсе C# Вы имеете:

MyProject. MyEnum.

К сожалению, код, который реализует интерфейс VB.NET, должен был бы быть изменен для поддержки того, что тип, возвращенный MyInterface. Число изменилось.

IL поддерживает вложенные типы в интерфейсах, таким образом, это - тайна, почему C# не делает:

.class public interface abstract auto ansi MyInterface

{. экземпляр valuetype TestInterfaces свойства. Число MyInterface/MyEnum {.get экземпляр valuetype TestInterfaces. MyInterface/MyEnum TestInterfaces. MyInterface:: get_Number ()}

.class auto ansi sealed nested public MyEnum
    extends [mscorlib]System.Enum

{. полевая общественность статический литеральный valuetype TestInterfaces. MyInterface/MyEnum, Возможно, = int32 (2)

    .field public static literal valuetype TestInterfaces.MyInterface/MyEnum No = int32(1)

    .field public specialname rtspecialname int32 value__

    .field public static literal valuetype TestInterfaces.MyInterface/MyEnum Yes = int32(0)

}

}

Если у Вас есть много кода в других блоках, которые используют этот интерфейс, Ваш лучший выбор состоит в том, чтобы сохранить его в отдельном блоке VB.NET и сослаться на него из Ваших проектов C#. Иначе безопасно преобразовать его, но необходимо будет изменить любой код, который использует его для возврата другого типа.

11
ответ дан 6 December 2019 в 07:30
поделиться
public enum MyEnum
{
    Yes = 0,
    No = 1,
    Maybe = 2
}

public interface IMyInterface
{
    MyEnum Number { get; }
}
13
ответ дан 6 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: