7

C# に移植する必要がある次の VB.net インターフェイスがあります。C# では、インターフェイスでの列挙は許可されていません。このインターフェイスを使用するコードを変更せずにこれを移植するにはどうすればよいですか?

Public Interface MyInterface

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

    ReadOnly Property Number() As MyEnum

End Interface
4

2 に答える 2

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

public interface IMyInterface
{
    MyEnum Number { get; }
}
于 2008-10-07T13:57:52.957 に答える
11

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

于 2008-10-07T14:24:53.477 に答える