2009-07-03 39 views
16

Tôi đang gặp lỗi biên dịch từ thuộc tính sau.
Lỗi này là:Các công cụ sửa đổi truy cập trên các thành viên giao diện trong C#

"Các modifier 'công cộng' không hợp lệ cho mặt hàng này"

public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties 
{ 
    get { return properties; } 
    set { properties = value; } 
} 

nhưng nếu tôi loại bỏ các IWorkItemControl nó biên dịch tốt.

Tại sao tôi nhận được lỗi này và sự khác biệt của việc có/không có tên giao diện trong chữ ký là gì?

Trả lời

41

Explicit interface implementation không cho phép bạn chỉ định bất kỳ công cụ sửa đổi truy cập nào. Khi bạn thực hiện một thành viên giao diện một cách rõ ràng (bằng cách chỉ định tên giao diện trước tên thành viên), bạn có thể truy cập thành viên đó chỉ sử dụng giao diện. Về cơ bản, nếu bạn làm:

System.Collections.Specialized.StringDictionary IWorkItemControl.Properties 
{ 
    get { return properties; } 
    set { properties = value; } 
} 

Bạn có thể không cần làm:

MyClass x = new MyClass(); 
var test = x.Properties; // fails to compile 
// You should do: 
var test = ((IWorkItemControl)x).Properties; // accessible through the interface 

Có một số trường hợp sử dụng cho EII. Ví dụ: bạn muốn cung cấp phương thức Close cho lớp học của mình để giải phóng tài nguyên có được nhưng bạn vẫn muốn triển khai IDisposable. Bạn có thể làm:

class Test : IDisposable { 
    public void Close() { 
     // Frees up resources 
    } 
    void IDisposable.Dispose() { 
     Close(); 
    } 
} 

Bằng cách này, người tiêu dùng của lớp chỉ có thể gọi trực tiếp Close (và họ thậm chí sẽ không thấy Dispose trong danh sách Intellisense) nhưng bạn vẫn có thể sử dụng lớp Test bất cứ nơi nào một IDisposable dự kiến ​​(ví dụ: trong câu lệnh using).

Một trường hợp sử dụng cho EII đang cung cấp triển khai khác nhau của một thành viên giao diện hệt tên cho hai giao diện:

interface IOne { 
    bool Property { get; } 
} 

interface ITwo { 
    string Property { get; } 
} 

class Test : IOne, ITwo { 
    bool IOne.Property { ... } 
    string ITwo.Property { ... } 
} 

Như bạn thấy, mà không EII nó thậm chí không thể để thực hiện cả hai giao diện của ví dụ này trong một lớp đơn (vì các thuộc tính chỉ khác nhau về kiểu trả về). Trong các trường hợp khác, bạn có thể muốn cố ý cung cấp hành vi khác nhau cho các chế độ xem riêng lẻ của một lớp thông qua các giao diện khác nhau.

0

Tất cả các thành phần của giao diện phải được công khai. Sau cùng, giao diện chế độ xem công khai của một đối tượng.

Kể từ Thuộc tính là một yếu tố của một giao diện IWorkItemControl, nó đã được công khai, và bạn không thể xác định mức độ truy cập của nó, thậm chí dư thừa xác định rằng nó là công khai.

+1

Đây không phải là lý do rất mạnh vì bạn vẫn phải chỉ định công khai theo cách thủ công cho tất cả các thành viên được triển khai ngầm. Nếu đó là trường hợp, trình biên dịch có thể tự động giả định những người như công chúng quá. –

+0

Điều này là sai, vì bạn có thể có giao diện nội bộ. –

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