2008-10-07 27 views

Trả lời

11

Tóm lại, bạn không thể thay đổi giao diện mà không phá vỡ mã, bởi vì C# không thể loại tổ trong giao diện. Khi bạn thực hiện giao diện các phiên bản VB.NET, bạn được xác định Số đó sẽ trả về một loại MyInterface.MyEnum:

class TestClass3 : TestInterfaces.MyInterface 
{ 

    TestInterfaces.MyInterface.MyEnum TestInterfaces.MyInterface.Number 
    { 
     get { throw new Exception("The method or operation is not implemented."); } 
    } 

} 

Tuy nhiên, vì C# không thể loại lọt vào trong giao diện, nếu bạn phá vỡ các điều tra viên ra khỏi giao diện, bạn sẽ trả về một kiểu dữ liệu khác: trong trường hợp này là MyEnum.

class TestClass2 : IMyInterface 
{ 

    MyEnum IMyInterface.Number 
    { 
     get { throw new Exception("The method or operation is not implemented."); } 
    } 

} 

Hãy nghĩ về điều đó bằng tên loại hoàn toàn đủ điều kiện. Trong giao diện VB.NET, bạn có một kiểu trả về của

MyProject.MyInterface.MyEnum

trong giao diện C#, bạn phải:

MyProject.MyEnum.

Thật không may, mã thực hiện giao diện VB.NET sẽ phải được thay đổi để hỗ trợ thực tế là loại trả về bởi MyInterface.Number đã thay đổi.

IL hỗ trợ các loại làm tổ bên trong giao diện, do đó, nó là một bí ẩn tại sao C# không:

.class public interface abstract auto ansi MyInterface 

{ .property dụ ValueType TestInterfaces.MyInterface/MyEnum Số { dụ .get ValueType TestInterfaces.MyInterface/MyEnum TestInterfaces.MyInterface :: get_Number() }

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

{ .field public static va đen luetype TestInterfaces.MyInterface/MyEnum lẽ = 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) 

} 

}

Nếu bạn có rất nhiều mã trong hội khác mà làm cho sử dụng giao diện này, đặt cược tốt nhất của bạn là để giữ nó bên trong một riêng biệt VB.NET lắp ráp, và tham khảo nó từ các dự án C# của bạn. Nếu không, sẽ an toàn để chuyển đổi nó, nhưng bạn sẽ phải thay đổi bất kỳ mã nào sử dụng mã đó để trả về loại khác.

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

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

Điều này vi phạm mã đang sử dụng giao diện. Tôi muốn tránh điều đó nếu có thể. – user25825

Các vấn đề liên quan