"T: class" sẽ buộc loại chung được chỉ định là một lớp, không phải là một giá trị. Ví dụ, chúng ta có thể tạo nên một lớp ObjectList đòi hỏi kiểu generic quy định để trở thành một lớp, không phải là một giá trị:
class ObjectList<T> where T : class {
...
}
class SomeObject { ... }
ObjectList<int> invalidList = new ObjectList<int>(); //compiler error
ObjectList<SomeObject> someObjectList = new ObjectList<SomeObject>(); //this works
Điều này buộc một bất biến vào loại T generic của bạn mà nếu không có thể không được thực thi. "T: struct" sẽ hoạt động theo cùng một cách. Lưu ý rằng bạn cũng có thể sử dụng cấu trúc này để thực thi không chỉ loại T là một lớp, mà còn là nó khớp với một giao diện. Mẫu mã tôi lấy từ đây cũng có
class MyList<T> where T : class, IEntity { ... }
buộc T là một lớp VÀ cũng là một IEntity.
Nguồn
2011-01-19 10:16:30
Cảm ơn bạn , nhưng tôi nhận thức được ngữ nghĩa của các ràng buộc chung - những gì tôi yêu cầu là các ví dụ trong đó các ràng buộc struct/class là * useful *. – Oak