2011-12-15 35 views
18

Khi xác định ràng buộc của thông số loại chung, chúng tôi phải đặt class() ở mặt trước và new() ở cuối, ví dụ.Tại sao một số lệnh được thực thi trong các ràng buộc tham số chung?

Tại sao điều này, tại sao tôi không thể đặt các ràng buộc của mình theo bất kỳ thứ tự nào?

Có bất kỳ hạn chế nào khác đối với việc đặt hàng bên cạnh class/struct trước tiên, new() ở cuối không?


Ví dụ:

protected T Clone<T>() where T : class, ICopyable<T>, new() 
+6

Là nền, đặc tả ngôn ngữ cho biết ràng buộc phải nằm trong thứ tự * ràng buộc chính, ràng buộc phụ, ràng buộc constructor *, trong đó * ràng buộc chính * đơn giản là * class * hoặc * struct *, ràng buộc thứ hai * * là một giao diện hoặc loại lớp nhất định và ràng buộc * constructor * chỉ đơn giản là * new() *. Đối với lý do tại sao họ được phân loại như vậy và yêu cầu thứ tự đó, tôi không có ý tưởng. Có lẽ đặc tả ngôn ngữ được chú thích sẽ làm sáng tỏ điều đó? –

+0

Thú vị, cảm ơn. Đó là lý do tại sao tôi đặc biệt quan tâm. –

Trả lời

23

Không có lý do cụ thể tại sao trật tự đó đã được lựa chọn. Thứ tự được chọn đi từ tổng quát hơn đến cụ thể hơn, mà tôi cho là một tài sản hợp lý tốt đẹp.

Đối với câu hỏi "tại sao yêu cầu đơn hàng?", Việc thực hiện và thử nghiệm các nhóm thực hiện đơn giản, rõ ràng hơn được áp đặt bởi ngôn ngữ sẽ dễ dàng hơn. Chúng tôi có thể cho phép các ràng buộc đi kèm theo bất kỳ thứ tự nào, nhưng điều gì sẽ khiến chúng tôi mua?

Tôi càng làm việc trên các ngôn ngữ càng có nhiều ý kiến ​​rằng mỗi lần bạn cung cấp cho người dùng một lựa chọn, bạn sẽ cho họ cơ hội tạo ra lựa chọn không tốt. Nguyên tắc thiết kế cơ bản của C# là chúng tôi cho bạn biết khi mọi thứ có vẻ sai và buộc bạn phải làm cho chúng đúng - đó không phải là nguyên tắc thiết kế cơ bản của JavaScript. Nguyên tắc thiết kế cơ bản của nó là "lộn xộn và cố gắng làm những gì người dùng muốn nói". Bằng cách đặt nhiều hạn chế hơn về cú pháp chính xác trong C#, chúng tôi có thể đảm bảo tốt hơn rằng ngữ nghĩa dự định được thể hiện tốt trong chương trình.

Ví dụ, nếu tôi được thiết kế một C# -like ngôn ngữ ngày nay không có cách nào đó tôi sẽ có cú pháp mơ hồ như:

class C : X , Y 

hoặc

... where T : X, Y 

Y rõ ràng là dự định được một giao diện. Là X? Chúng tôi không thể nói cú pháp cho dù X được dự định là một giao diện hay một lớp học. Đủ để nói sự mơ hồ này rất phức tạp những thứ như phát hiện chu kỳ trong các loại cơ sở vs giao diện và như vậy. Nó sẽ dễ dàng hơn nhiều nếu tất cả lo lắng nếu nó có nhiều chi tiết hơn, như trong VB.

+1

+1 Cảm ơn bạn đã dành thời gian để cung cấp một số thông tin chi tiết về các quyết định được đưa ra và tại sao. –

+2

Tôi luôn thấy kỳ quặc rằng C# thể hiện sự thừa kế và thực hiện các giao diện khác với Java (mà nó rõ ràng), khi C# bị ảnh hưởng rất nhiều bởi Java ở hầu hết các khía cạnh khác. Nó thậm chí còn kỳ quặc hơn khi bạn nói nó làm phức tạp các công việc biên dịch. – MgSam

+0

"dễ dàng hơn về các nhóm thực hiện và thử nghiệm" .. điều đó làm tôi ngạc nhiên. Mặc dù việc thực hiện ngữ pháp nhỏ hơn có thể dễ dàng hơn một chút, giờ đây bạn có toàn bộ tính năng bổ sung để triển khai và thử nghiệm: "Tạo lỗi khi đơn đặt hàng sai" –

1

Giống như hầu hết các câu hỏi liên quan đến cú pháp, câu trả lời cơ bản là vì thông số kỹ thuật nói như vậy. Chúng ta có được ngữ pháp sau đây cho các ràng buộc kiểu generic từ đặc tả C# 5.0 (Phần 10.1.5)

kiểu tham số trở ngại:

primary-constraint 
secondary-constraints 
constructor-constraint 
primary-constraint , secondary-constraints 
primary-constraint , constructor-constraint 
secondary-constraints , constructor-constraint 
primary-constraint , secondary-constraints , constructor-constraint 

tiểu khó khăn:

class-type 
class 
struct 

thứ ràng buộc:

interface-type 
type-parameter 
secondary-constraints , interface-type 
secondary-constraints , type-parameter 

constructor-chế:

new ( ) 

Eric Lippert đã làm một công việc tuyệt vời của việc giải thích lý do tại sao nó được thiết kế theo cách này, vì vậy tôi sẽ không nói thêm về điều đó.

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