Vui lòng cung cấp thêm giải thích rõ ràng nếu câu trả lời của tôi có vẻ không cân bằng.
Không có ràng buộc chung về các toán tử trong ngôn ngữ C#, ít nhất. Như Jon Skeet đã chứng minh với Unconstrained Melody, các ràng buộc thực sự có thể hoàn toàn hợp lệ trong chính CLR.
Điều tốt nhất bạn có thể làm với các ràng buộc là cung cấp các giao diện/lớp tùy chỉnh hiển thị các hành động bạn cần. Bạn sẽ không thể cung cấp nguyên thủy (trừ khi bạn cũng thực hiện toán tử implicit
), nhưng ít nhất nó sẽ cho phép bạn tạo mã chung cho phần toán học.
Ràng buộc chung cho phép trình biên dịch phỏng đoán các thành viên có sẵn dựa trên mẫu số chung thấp nhất (như được chỉ định bởi ràng buộc hoặc thiếu). Hầu hết thời gian, Generics là không bị giới hạn và do đó cung cấp cho bạn chỉ object
ngữ nghĩa.
Ngoài ra, tránh sử dụng những hạn chế và sử dụng
dynamic
để tạm thời lưu trữ các biến chung chung và sau đó đưa ra giả định (thông qua gõ vịt) mà nó có các nhà khai thác có liên quan:
class Program
{
static void Main(string[] args)
{
var result = Add<int, long, float>(1, 2);
Console.WriteLine(result); // 3
Console.WriteLine(result.GetType().FullName); // System.Single
Console.Read();
}
static T3 Add<T1, T2, T3>(T1 left, T2 right)
{
dynamic d1 = left;
dynamic d2 = right;
return (T3)(d1 + d2);
}
}
này liên quan đến DLR và sẽ có một số chi phí hoạt động (tôi không có số liệu chính xác), đặc biệt nếu bạn dự định tính toán là quan trọng về hiệu suất.
Tôi không chắc chắn những gì bạn có nghĩa là "tuyên bố cùng loại generic nhiều lần", hoạt động này:
class Tuple<T1, T2> // etc.
var myTuple = new Tuple<int, int>(1, 2);
Thật không may, loại hạn chế không cho phép bạn để yêu cầu các loại hỗ trợ các nhà khai thác arithmethic. Điều tôi thấy thú vị là trong mã nguồn BCL cho ví dụ: 'Int32' bạn sẽ tìm thấy một giao diện' IArithmetic 'trong danh sách thừa kế được nhận xét. Đây là suy đoán thuần túy về phía tôi nhưng nếu Microsoft kích hoạt giao diện đó trong BCL thì bạn có thể chỉ định 'IArithmetic ' như một ràng buộc để cho phép bạn viết các lớp generic của riêng bạn với số học. –
Liên kết đến câu hỏi tương tự: http://stackoverflow.com/q/4039694/613130 – xanatos