2008-10-07 25 views
7

Tengo la siguiente interfaz VB.net que necesito para portar a C#. C# no permite enumeraciones en las interfaces. ¿Cómo puedo portar esto sin cambiar el código que usa esta interfaz?Cómo convertir la interfaz VB.net con enum a C#

Public Interface MyInterface 

    Enum MyEnum 
     Yes = 0 
     No = 1 
     Maybe = 2 
    End Enum 

    ReadOnly Property Number() As MyEnum 

End Interface 

Respuesta

11

En resumen, no se puede cambiar esa interfaz sin romper el código, porque C# puede no tipos de nidos en las interfaces. Cuando se implementa la interfaz de las versiones de VB.NET, que está especificando que el número devolverá un tipo de MyInterface.MyEnum:

class TestClass3 : TestInterfaces.MyInterface 
{ 

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

} 

Sin embargo, puesto que C# no puede anidar dentro tipos de interfaces, si se rompe el empadronador de En la interfaz, devolverá un tipo de datos diferente: en este caso, MyEnum.

class TestClass2 : IMyInterface 
{ 

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

} 

Piénsalo con el nombre de tipo completo. En la interfaz de VB.NET, usted tiene un tipo de retorno de

MyProject.MyInterface.MyEnum

en la interfaz de C#, tiene:

MyProject.MyEnum.

Desafortunadamente, el código que implementa la interfaz VB.NET debería modificarse para respaldar el hecho de que el tipo devuelto por MyInterface.Number ha cambiado.

IL soporta tipos de anidación dentro de las interfaces, así que es un misterio por qué C# no:

.class public interface abstract auto ansi MyInterface 

{ .property ejemplo valuetype TestInterfaces.MyInterface/Número MyEnum { ejemplo .get valuetype TestInterfaces.MyInterface/MyEnum TestInterfaces.MyInterface :: get_Number() }

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

{ .field pública va literal estática luetype TestInterfaces.MyInterface/MyEnum Tal vez = 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) 

} 

}

Si usted tiene un montón de código en otros montajes que hacen uso de esta interfaz, lo mejor es mantenerlo dentro de una separada Ensamblado de VB.NET, y hacer referencia a él desde sus proyectos de C#. De lo contrario, es seguro convertirlo, pero tendrá que cambiar cualquier código que lo use para devolver el tipo diferente.

13
public enum MyEnum 
{ 
    Yes = 0, 
    No = 1, 
    Maybe = 2 
} 

public interface IMyInterface 
{ 
    MyEnum Number { get; } 
} 
+0

Esto rompe el código que está utilizando la interfaz. Me gustaría evitar eso si es posible. – user25825