Trong Tuple, nếu bạn có nhiều hơn 7 mục, bạn có thể cung cấp mục thứ 8 là một bộ khác và xác định tối đa 7 mục và sau đó là một bộ khác làm thứ 8 và trên và trên xuống dòng. Tuy nhiên, không có ràng buộc về mục thứ 8 tại thời gian biên dịch. Ví dụ: đây là mã pháp lý cho trình biên dịch:Tại sao lệnh kiểm tra trong Tuple <T1... TRest> không bị hạn chế?
var tuple = new Tuple<int, int, int, int, int, int, int, double>
(1, 1, 1, 1, 1, 1, 1, 1d);
Mặc dù tài liệu intelliSense nói rằng TREST phải là Tuple. Bạn không nhận được bất kỳ lỗi nào khi viết hoặc xây dựng mã, nó không biểu hiện cho đến khi chạy theo dạng của một ArgumentException.
Bạn có thể khoảng triển khai một Tuple sau vài phút, hoàn thành với mục thứ 8 bị ràng buộc bởi Tuple. Tôi chỉ tự hỏi tại sao nó lại được thực hiện hiện tại? Có thể đó là vấn đề tương thích về phía trước, nơi họ có thể thêm nhiều yếu tố hơn với giả thuyết C# 5?
phiên bản ngắn của thô thực hiện
interface IMyTuple { }
class MyTuple<T1> : IMyTuple
{
public T1 Item1 { get; private set; }
public MyTuple(T1 item1) { Item1 = item1; }
}
class MyTuple<T1, T2> : MyTuple<T1>
{
public T2 Item2 { get; private set; }
public MyTuple(T1 item1, T2 item2) : base(item1) { Item2 = item2; }
}
class MyTuple<T1, T2, TRest> : MyTuple<T1, T2> where TRest : IMyTuple
{
public TRest Rest { get; private set; }
public MyTuple(T1 item1, T2 item2, TRest rest)
: base(item1, item2)
{
Rest = rest;
}
}
...
var mytuple = new MyTuple<int, int, MyTuple<int>>
(1, 1, new MyTuple<int>(1)); // legal
var mytuple2 = new MyTuple<int, int, int>(1, 2, 3); // illegal at compile time
Thật sao? Làm thế nào một người có thể thực hiện điều đó sao cho phần tử cuối cùng bị ràng buộc là một 'Tuple' có kích thước bất kỳ mà không định nghĩa một lớp cơ sở bổ sung hoặc giao diện phổ biến trong các kích thước' Tuple' chung khác nhau? Tôi không thấy làm thế nào bạn nghĩ rằng họ có thể làm điều đó trong C#. – mquander
@mquander, Tuple triển khai ITuple. Bạn có thể định nghĩa kiểu Tuple (MyTuple) của riêng bạn để ràng buộc mục cuối cùng với một giao diện (IMyTuple) và bạn nhận được một kiểm tra thời gian biên dịch. –
Ồ, tôi không biết về 'ITuple'. Cảm ơn vì sự đúng đắn của bạn. Tôi lưu ý rằng 'ITuple' là nội bộ; có lẽ họ muốn giữ nó bên trong - nếu nó là một ràng buộc ở đây, nó sẽ phải được công khai. – mquander