Không, điều này là không thể. Nó chủ yếu là do sự khác biệt giữa các mẫu C++ và C# generics:
Khi bạn biên dịch mẫu C++, mã kết quả có các loại như vector<int>
và vector<string>
. Điều này có nghĩa là trình biên dịch phải biết tất cả các tham số kiểu có thể, nhưng nó cũng có nghĩa là nó có thể kiểm tra chúng đúng đắn.
Khi bạn biên dịch loại C# chung, bạn thực sự chỉ tạo một loại chung: List<T>
. Bởi vì điều này, trình biên dịch C# không phải biết tất cả các loại có thể ở dạng biên dịch, có nghĩa là bạn có thể có các kiểu generic trong các thư viện nhị phân, điều này là không thể với C++. Nhưng điều này cũng có nghĩa là bạn không thể kiểm tra tất cả các loại. Để có thể làm điều gì đó như vậy, có những ràng buộc, nhưng họ không thể thực hiện một số việc kiểm tra thời gian biên dịch của C++, như kiểm tra sự hiện diện của các phương thức nhất định (không sử dụng giao diện hoặc một số lớp cơ sở) hoặc sự hiện diện của các toán tử thích hợp.
Trong C# 4, bạn có thể đạt được hiệu quả tương tự như loại mẫu sử dụng dynamic
, nhưng điều này không không kiểm tra thời gian biên dịch, có nghĩa là bạn bị mất an toàn - bạn có thể đặt trong một loại mà không có các thành viên thích hợp và bạn sẽ không tìm ra cho đến khi bạn đạt đến dòng mã đó khi chạy.
Nhưng ràng buộc giao diện đã là một cách khá tốt để thể hiện một cái gì đó như 'T thực hiện một phương pháp X() phù hợp với một số chữ ký', bạn không nghĩ? –