2008-10-07 41 views
7

我有以下VB.net接口,我需要移植到C#。 C#不允許在接口中枚舉。如何在不更改使用此接口的代碼的情況下移植此代碼?如何將VB.net接口與枚舉轉換爲C#

Public Interface MyInterface 

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

    ReadOnly Property Number() As MyEnum 

End Interface 

回答

11

總之,你不能改變的接口不破壞代碼,因爲C#不能嵌套類型的接口。當你實現了VB.NET版本的界面,你指定號碼會返回一個類型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例如值類型TestInterfaces.MyInterface/MyEnum數 { 不用彷徨實例值類型TestInterfaces.MyInterface/MyEnum TestInterfaces.MyInterface :: get_Number() }

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

{ 點域公共靜態字面VA luetype TestInterfaces.MyInterface/MyEnum也許= 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#項目中引用它。否則,轉換它是安全的,但您必須更改任何使用它的代碼才能返回不同的類型。

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

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

這打破了使用界面的代碼。如果可能,我想避免這種情況。 – user25825 2008-10-08 18:41:16