2008-10-07 3 views
7

konvertieren Ich habe die folgende VB.net-Schnittstelle, die ich an C# portieren muss. C# erlaubt keine Aufzählungen in Schnittstellen. Wie kann ich dies portieren, ohne Code zu ändern, der diese Schnittstelle verwendet?Wie VB.net Schnittstelle mit Enum zu C#

Public Interface MyInterface 

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

    ReadOnly Property Number() As MyEnum 

End Interface 

Antwort

11

Kurz gesagt, Sie können nicht, dass die Schnittstelle ändern, ohne Code zu brechen, weil C# können nicht verschachtelt Typen in Schnittstellen. Wenn Sie auf die VB.NET Versionen der Schnittstelle implementieren, geben Sie an, dass Zahl eine Art MyInterface.MyEnum zurück:

class TestClass3 : TestInterfaces.MyInterface 
{ 

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

} 

Da jedoch C# nicht verschachtelt Typen innerhalb von Schnittstellen, wenn Sie den Enumerator brechen aus In der Schnittstelle geben Sie einen anderen Datentyp zurück: In diesem Fall MyEnum.

class TestClass2 : IMyInterface 
{ 

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

} 

Denken Sie darüber nach, indem Sie den vollständig qualifizierten Typnamen verwenden. In der VB.NET-Schnittstelle, Sie in der C# Schnittstelle

MyProject.MyInterface.MyEnum

, einen Rückgabetyp Sie haben:

MyProject.MyEnum.

Leider müsste Code, der die VB.NET-Schnittstelle implementiert, geändert werden, um die Tatsache zu unterstützen, dass der von MyInterface.Number zurückgegebene Typ geändert wurde.

IL unterstützt Verschachtelung Typen innerhalb von Schnittstellen, so ist es ein Rätsel, warum C# nicht:

.class public interface abstract auto ansi MyInterface 

{ .property Beispiel Valuetype TestInterfaces.MyInterface/MyEnum Anzahl { .get Beispiel Valuetype TestInterfaces.MyInterface/MyEnum TestInterfaces.MyInterface :: GET_NUMBER() }

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

{ .field public static wörtliche va luetype TestInterfaces.MyInterface/MyEnum Vielleicht = 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) 

} 

}

Wenn Sie eine Menge Code in anderen Baugruppen haben, die Verwendung dieser Schnittstelle, die beste Wahl zu machen ist, es zu halten in einem separaten VB.NET-Assembly, und referenzieren Sie es aus Ihren C# -Projekten. Andernfalls ist es sicher, es zu konvertieren, aber Sie müssen jeden Code ändern, der es verwendet, um den anderen Typ zurückzugeben.

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

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

Dies unterbricht den Code, der die Schnittstelle verwendet. Das möchte ich möglichst vermeiden. – user25825