つまり、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 インスタンス 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 public staticliteral 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# プロジェクトから参照することをお勧めします。それ以外の場合は、安全に変換できますが、それを使用するコードを変更して別の型を返す必要があります。