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.
Dies unterbricht den Code, der die Schnittstelle verwendet. Das möchte ich möglichst vermeiden. – user25825