2008-10-07 6 views
7

J'ai l'interface VB.net suivante que j'ai besoin de porter sur C#. C# n'autorise pas les énumérations dans les interfaces. Comment puis-je porter ceci sans changer le code qui utilise cette interface?Comment faire pour convertir l'interface VB.net avec enum à C#

Public Interface MyInterface 

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

    ReadOnly Property Number() As MyEnum 

End Interface 

Répondre

11

En bref, vous ne pouvez pas changer cette interface sans casser le code, parce que C# ne peut pas les types de nids dans les interfaces. Lorsque vous implémentez l'interface des versions VB.NET, vous indiquez ce numéro renverra un type de MyInterface.MyEnum:

class TestClass3 : TestInterfaces.MyInterface 
{ 

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

} 

Cependant, étant donné que C# ne peut pas les types de imbriquer interfaces, si vous briser le recenseur sur l'interface, vous retournerez un type de données différent: dans ce cas, MyEnum.

class TestClass2 : IMyInterface 
{ 

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

} 

Pensez-y en utilisant le nom de type complet. Dans l'interface VB.NET, vous avez un type de retour de

MyProject.MyInterface.MyEnum

Dans l'interface C#, vous avez:

MyProject.MyEnum.

Malheureusement, le code qui implémente l'interface VB.NET doit être modifié pour prendre en charge le fait que le type renvoyé par MyInterface.Number a changé.

IL supporte les types de nidification à l'intérieur des interfaces, il est donc un mystère pourquoi C# ne pas:

.class public interface abstract auto ansi MyInterface 

{ .property exemple valuetype TestInterfaces.MyInterface/MyEnum Numéro { exemple .get valuetype TestInterfaces.MyInterface/MyEnum TestInterfaces.MyInterface :: get_Number() }

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

{ .field va littéralement public static luetype TestInterfaces.MyInterface/MyEnum = Peut-être 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 vous avez beaucoup de code dans d'autres ensembles qui utilisent cette interface, le mieux est de le garder dans une séparée VB.NET assembly, et référence à partir de vos projets C#. Sinon, il est sûr de le convertir, mais vous devrez changer le code qui l'utilise pour retourner le type différent.

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

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

Cela casse le code qui utilise l'interface. Je voudrais éviter cela si possible. – user25825

Questions connexes