Tóm lại: có thể xác định phương pháp chung trong đó tham số kiểu (T
) bị giới hạn ở string
hoặc int[]
? Trong pseudo-C#, những gì tôi muốn làm là:Có thể hạn chế tham số kiểu generic thành String OR Array
public static int MyMethod<T> (T arg1, T arg2)
where T : (has an indexer that returns an int) {
// stuff with arg1[i], arg2[j], etc...
}
Lưu ý rằng trong C#, do được xây dựng trong string
indexer (mà trả về một char
) cùng với chuyển đổi ngầm từ char
để int
, biểu thức sau đây nghĩa một cách chính xác những điều tương tự dù source
là một string
hoặc một int[]
:
int someval = source[index];
mỗi thread Constrain generic extension method to base types and string tôi nhận ra tôi không thể chỉ làm một danh sách các loại hủy liên kết giữa trongĐiều khoản ràng buộc. Cả hai int[]
và string
sẽ tuân thủ T: IEnumerable<int>
, nhưng IEnumerable<T>
không yêu cầu người triển khai có trình chỉ mục, đó chính xác là tính năng phổ biến mà tôi đang sử dụng từ cả hai loại.
Mục đích của việc này là tôi đang xây dựng một số chức năng phân tích và phân tích cú pháp chuỗi được tối ưu hóa cao như triển khai nhanh thuật toán khoảng cách Damerau – Levenshtein. Tôi đã thấy rằng đầu tiên chuyển đổi chuỗi của tôi thành mảng int đôi khi có thể mang lại các thực thi nhanh hơn đáng kể trong việc xử lý ký tự từng ký tự lặp đi lặp lại (như với thuật toán D-L). Điều này phần lớn là do việc so sánh các giá trị int
nhanh hơn nhiều so với các giá trị char
.
Từ tác dụng là 'đôi khi'. Đôi khi nó hoạt động nhanh hơn trên dây và tránh chi phí chuyển đổi và sao chép đầu tiên thành mảng int
. Vì vậy, bây giờ tôi có các phương pháp thực sự giống hệt ngoại trừ các khai báo.
Tất nhiên tôi có thể sử dụng dynamic
, nhưng hình phạt hiệu suất từ kiểm tra thời gian chạy hoàn toàn phá hủy mọi lợi ích được thực hiện trong việc xây dựng các phương pháp. (Tôi đã làm kiểm tra nó).
Trong có ý nghĩa gì khi xử lý 'T' tĩnh như * hoặc * loại này hay kiểu khác? Điểm hạn chế là cho phép bạn hoạt động trên các biến kiểu 'T' và mong đợi mức độ tương thích kiểu tối thiểu. Ràng buộc với hai loại không tương thích lẫn nhau là bizzarre. –
@ kirk-woll: Khi tôi mô tả chi tiết, chúng không tương thích lẫn nhau cho mục đích của tôi. Ngược lại, chúng giống hệt nhau. Tôi đã xây dựng và đang sử dụng các phương thức giống hệt 100%, ngoại trừ các tham số trong một phiên bản được khai báo là 'chuỗi' và trong phiên bản khác được khai báo là' int [] '. Trong cả hai trường hợp, tôi hoạt động trên mỗi thành viên của bộ sưu tập dưới dạng số nguyên. –
Không. Một 'chuỗi' và (bất kỳ)' mảng 'thống nhất tại 'đối tượng', một chuỗi là * không * một' char [] 'trong C#, mặc dù bạn có thể tạo một' char [] '* từ * một chuỗi , nhưng đó là một đối tượng mảng * mới * với nội dung được sao chép. –