2008-10-07 82 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