Короче говоря, вы не можете изменить этот интерфейс, не нарушая код, потому что 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.Number, изменился.
IL поддерживает типы вложенности внутри интерфейсов, поэтому загадка, почему C # этого не делает:
.class public interface abstract auto ansi MyInterface
{
.property instance valuetype TestInterfaces.MyInterface / MyEnum Number
{
.get экземпляр valuetype TestInterfaces.MyInterface / MyEnum TestInterfaces.MyInterface :: get_Number ()
}
.class auto ansi sealed nested public MyEnum
extends [mscorlib]System.Enum
{
.field публичный статический литерал valuetype TestInterfaces.MyInterface / MyEnum Maybe = 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 #. В противном случае его безопасно конвертировать, но вам придется изменить любой код, который использует его, чтобы вернуть другой тип.