2010-04-01 24 views
8

Khuôn khổ .NET đang thêm giao diện ISet<T> với bản phát hành 4.0. Trong cùng một phiên bản, F # đang được thêm vào như là một ngôn ngữ hạng nhất. F # cung cấp lớp Set<'T> không thay đổi.Tại sao F # Set không triển khai ISet <T>?

Có vẻ hợp lý với tôi rằng bộ không thay đổi được cung cấp sẽ thực hiện giao diện ISet<T>, nhưng không. Có ai biết tại sao không?

Tôi đoán là họ không muốn triển khai giao diện có thể thay đổi được, nhưng tôi không nghĩ rằng giải thích này được duy trì. Rốt cuộc, lớp học Map<'Key, 'Value> của họ thực hiện IDictionary, điều này có thể thay đổi. Và có những ví dụ ở nơi khác trong khuôn khổ các lớp thực hiện các giao diện chỉ thích hợp một phần.

suy nghĩ khác của tôi là ISet<T> là mới, vì vậy có thể họ không có được xung quanh với nó. Nhưng điều đó có vẻ khá mỏng.

Thực tế là ISet<T> là chung chung (v. IDictionary, không phải là) có liên quan gì đến nó?

Bất kỳ suy nghĩ nào về vấn đề này sẽ được đánh giá cao.

+0

Trong chính khuôn khổ .NET, 'ReadOnlyCollection ' triển khai 'ICollection ', là một giao diện có thể thay đổi. – Steven

+0

@Steven Đúng, đó là một ví dụ về một lớp khung công tác thực hiện một giao diện không hoàn toàn phù hợp. –

Trả lời

5

Ngoại ý Tôi không nghĩ rằng Tôi trước đây đã biết về ISet. (Thực ra tôi đã nhìn lại qua email cũ, và tìm thấy một đề cập đến các kế hoạch của BCL cho nó - từ năm 2008 - nhưng đó là nó. Vì vậy, tôi nghĩ nó không nằm trên radar của chúng tôi.)

Điều đó nói rằng, F # phấn đấu tương thích với mã nguồn giữa các .NET 2.0 và .NET 4.0 bit của nó, đến điểm quay lại các thực thể .NET 4.0 thành phiên bản FSharp.Core.dll 2.0. Ví dụ: 2.0 FSharp.Core chứa System.Tuple, System.BigInteger, System.Threading.CancelationTokenSource (một phần của mô hình lập trình không đồng bộ), v.v. và ISet có khả năng sẽ là một công việc khác để quay lại (không rõ tôi có cần thiết không) 'để cổng nó, mặc dù).

Tôi sẽ gửi một vấn đề để xem, mặc dù nó có thể được khắc phục vào thời điểm này.

+1

Điều đó có ý nghĩa. Tôi đã không nhận ra có một ổ đĩa để giữ cho F # tương thích với mã nguồn trên các khung công tác. Chỉ tò mò thôi, nhưng lý do đằng sau điều này là gì? Lập trường chính thức .NET 4.0 có chứa phiên bản "mới" của F # không, nhưng đúng hơn là bao bì chính thức, hạng nhất của F # vì nó tồn tại ngày hôm nay? –

5

Vì không có ai khác nhảy vào, tôi sẽ thêm suy đoán của tôi. Trước hết, phần lớn giao diện IDictionary<'k,'v> vẫn có ý nghĩa đối với từ điển bất biến; nó thực sự chỉ thêm hoặc loại bỏ các yếu tố riêng lẻ sẽ không hoạt động. Thứ hai, có một số lượng phong nha của mã đã được viết mà dựa trên IDictionary, do đó, có thể sử dụng các giá trị F # với mã đó là một cộng thêm tốt đẹp.

Mặt khác, một số phương pháp của ISet<'t> yêu cầu đột biến, bao gồm không chỉ thêm các phần tử riêng lẻ, mà còn một số toán tử thay đổi bộ như công đoàn và giao lộ. Ngoài ra, nhiều trường hợp sử dụng được thiết lập đã được bao gồm bởi giao diện IEnumerable<'t> - Tôi nghĩ rằng sẽ hiếm khi mọi người dựa vào việc triển khai ISet<'t> cho mã dựa trên không thay đổi.

Tôi không nghĩ rằng genericity có bất cứ điều gì để làm với nó - lưu ý rằng mặc dù các tài liệu MSDN, F # bản đồ thực hiện giao diện IDictionary chung, không phải là không chung chung.

+1

Điều này nghe có vẻ hợp lý. Tuy nhiên, nó bực bội nếu đúng.Nó có vẻ như một sai lầm với tôi để bao gồm tất cả các phương thức giao diện đó ngụ ý sự biến đổi của lớp thực hiện. (Tương tự như vậy, tôi nghĩ rằng nó sẽ là một sai lầm để bao gồm các phương pháp ngụ ý lớp nên được _immutable_.) Nó sẽ là tốt đẹp nếu 'ISet ' chỉ bao gồm "đọc" thành viên. Tôi nghĩ rằng giao diện như-là quá ý kiến, và bây giờ tôi _still_ không thực sự có một cách để giao tiếp đơn giản rằng "đây là một bộ sưu tập các mặt hàng độc đáo." (Ít nhất cho đến khi F # interop có liên quan.) –

+0

Có vẻ như không hoàn toàn đa số: theo số của tôi, chỉ có năm trong số 11 thành viên thích hợp của 'ISet ' yêu cầu đột biến. Nếu bạn bao gồm các thành viên được thừa kế từ 'ICollection ', nó sẽ trở thành tám của 18. (Và trong số này, ít nhất 'void Add (T item)' có thể sẽ được thực hiện một cách rõ ràng.) –

+0

Tôi đã nghĩ về cách viết một câu trả lời tương tự, nhưng sau đó tôi nhìn vào giao diện 'ISet ' và phát hiện ra rằng nó có khá nhiều thao tác vẫn có thể được thực hiện (cụ thể là 'SetEquals',' IsSubsetOf', 'IsSupersetOf',' Chồng chéo', 'IsProperSubsetOf',' IsProperSupersetOf'), có lẽ nó ít hơn 'IDictionary', nhưng vẫn còn khá ... Một lý do khác có thể là không có phương thức .NET nào có thể dùng' ISet ', vì vậy không có lý do ứng dụng nào để thực hiện nó (I đoán có thể có một số trường hợp sử dụng tốt cho 'IDictionary'). –

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