2015-06-05 16 views
21

Sử dụng các thuộc tính tự động để triển khai giao diện rõ ràng was not possible in C# 5, nhưng bây giờ C# 6 hỗ trợ getter-only auto-properties, điều này có thể thực hiện được ngay bây giờ, phải không?Triển khai rõ ràng giao diện bằng cách sử dụng thuộc tính tự động getter (tính năng C# 6)

Tạo thuộc tính tự động thành công trong C# 6, nhưng khi cố gán giá trị cho nó trong hàm tạo, bạn phải đúc this cho kiểu giao diện trước tiên, vì việc triển khai thực hiện rõ ràng. Nhưng đó là nơi cả VS 2015 RC và VS Mã 0.3.0 màn hình báo lỗi có thể được nhìn thấy trong các bình luận:

using static System.Console; 

namespace ConsoleApp 
{ 
    public interface IFoo { string TestFoo { get; } } 

    public class Impl : IFoo 
    { 
     // This was not possible before, but now works. 
     string IFoo.TestFoo { get; } 

     public Impl(string value) 
     { 
      // ERROR: Property or indexer 'IFoo.TestFoo' cannot be assigned to -- it is read only. 
      ((IFoo)this).TestFoo = value; 
     } 
    } 

    public class Program 
    { 
     // Yes, not static. DNX supports that (for constructor DI). 
     public void Main(string[] args) 
     { 
      IFoo foo = new Impl("World"); 

      WriteLine($"Hello {foo.TestFoo}"); 
      ReadKey(true); 
     } 
    } 
} 

Lưu ý: Tôi cập nhật các câu hỏi ban đầu mà thiết lập một giá trị không đổi để TestFoo. Trong kịch bản thế giới thực của tôi, giá trị xuất phát từ một đối tượng được tiêm vào hàm tạo. answer by Daniel A. White là tuyệt vời nếu giá trị được trả về bởi thuộc tính có thể được đặt lúc khởi tạo.

Nó nói:

tài sản hoặc indexer 'IFoo.TestFoo' không thể được gán cho - đó là chỉ đọc.

Có cách nào khác không, hoặc tôi vẫn phải sử dụng các thuộc tính với trường sao lưu cho trường hợp này?

Tôi đang sử dụng Visual Studio 2015 RC và Visual Studio Code 0.3.0 với DNX451 1.0.0-beta4.

Tôi có raised an issue over at the Roslyn GitHub page.


Các possible duplicate là một câu hỏi về định nghĩa một giao diện với một tài sản thường xuyên có thể được đọc. Câu hỏi của tôi là về việc triển khai một giao diện như vậy một cách rõ ràng bằng cách sử dụng một tính năng C# 6 mới, theo lý thuyết, nên làm điều này có thể. Xem các câu hỏi khác tôi liên kết trong câu đầu tiên cho một câu tương tự (nhưng đối với C# 5, nơi getter chỉ tự động thuộc tính mà không có sẵn).

+1

Tôi đoán đó chỉ là lỗi hoặc trình biên dịch không thể xác định được lỗi của nó vì nó nằm phía sau giao diện chỉ đọc. –

+0

@ DanielA.White Nó không khác nhiều so với một tài sản bình thường. 'string Foo {get; } 'là hợp pháp bây giờ mặc dù trong trường hợp đó bạn có thể thiết lập nó trong hàm tạo. –

+1

@ DanielA.White, vâng. Tôi đoán trình biên dịch chỉ cho phép truy cập trực tiếp vào thuộc tính từ hàm tạo và không cho phép truyền. –

Trả lời

3

Bạn có thể khắc phục điều này bằng cách sử dụng một trường chỉ đọc ủng hộ cho bất động sản được thực hiện một cách rõ ràng của bạn. Bạn có thể gán giá trị được tiêm vào trường sao lưu bên trong hàm khởi tạo, việc triển khai thực hiện của thuộc tính rõ ràng sẽ trả về nó.

public class Impl : IFoo 
{ 
    private readonly string _testFoo; 

    string IFoo.TestFoo => _testFoo; 

    public Impl(string value) 
    { 
     _testFoo = value; 
    } 
} 
1

Tôi nghĩ rằng bạn muốn điều này

string IFoo.TestFoo { get; } = "World"; 
+0

Có thể đoán tốt hơn so với 'chuỗi IFoo.TestFoo {get; bộ tư nhân; } 'nghĩ; p – leppie

+0

Xin lỗi, tôi nên rõ ràng hơn: Giá trị được đặt cho' TestFoo' xuất phát từ một đối tượng được tiêm vào hàm tạo, nhưng cảm ơn bạn. –

+0

@NikontheThird: Đề xuất của tôi có hoạt động không? Tôi không nghĩ rằng nó sẽ, nhưng nó có thể là một 'giải pháp cú pháp' tốt đẹp để thể hiện ý định. Có thể đáng giá khi đăng nhập một vấn đề trên roslyn github. – leppie

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