Exact rules for variance validity có chút mơ hồ và không cụ thể. Tôi sẽ liệt kê các quy tắc cho những gì làm cho một loại hợp lệ-covariantly, và đính kèm một số truy vấn và chú thích cá nhân cho mỗi quy tắc.Các quy tắc khác nhau trong C#
Một loại là hợp lệ covariantly nếu nó là:
1) một loại con trỏ, hoặc một loại phi generic.
Các điểm và loại không chung chung không phải là biến thể trong C#, ngoại trừ các mảng và đại biểu không chung chung. Các lớp chung, cấu trúc và enums là bất biến. Tôi có ở đây không?
2) Một loại mảng T [] trong đó T có giá trị covariantly.
Vì vậy, điều này có nghĩa rằng nếu loại yếu tố T
của một mảng T[]
là hiệp biến (tham chiếu hoặc mảng kiểu phần tử), sau đó mảng là hiệp biến, và nếu các loại nguyên tố là bất biến (kiểu giá trị), sau đó Array loại là bất biến. Mảng không thể là contravariant trong C#. Tôi có ở đây không?
3) Kiểu tham số kiểu chung, nếu nó không được khai báo là trùng lặp.
Chúng tôi thường nói rằng một loại chung là biến thể trên một loại thông số, nhưng đối với loại thông số là biến thể trên riêng nó. Đây có phải là một hình thức ngắn để nói điều đó không? ví dụ, loại chung T<out D>
là biến thể trên D
(do đó covariantly hợp lệ), do đó chúng ta có thể nói rằng tham số kiểu D
là covariantly hợp lệ. Tôi có đúng không?
4) Lớp xây dựng, cấu trúc, enum, giao diện hoặc loại đại biểu X có thể có giá trị covariantly. Để xác định nếu nó là, chúng tôi kiểm tra từng loại đối số khác nhau, tùy thuộc vào việc các tham số kiểu tương ứng đã được khai báo là covariant (out), contravariant (in), hoặc bất biến (không). (Tất nhiên các tham số kiểu chung của các lớp và cấu trúc sẽ không bao giờ được khai báo 'out' hoặc 'in'; chúng sẽ luôn luôn là bất biến.) Nếu tham số kiểu thứ i được khai báo là covariant, thì Ti phải hợp lệ covariantly. Nếu nó được khai báo là contravariant, thì Ti phải có giá trị tương ứng. Nếu nó được khai báo là bất biến, thì Ti phải có giá trị bất biến.
Quy tắc cuối cùng này, từ trên xuống dưới, hoàn toàn không rõ ràng.
Có phải chúng ta đang nói về phương sai của loại chung trên tất cả các tham số loại vào/ra/bất biến của nó không? Theo định nghĩa, một kiểu generic có thể là covariant/contravariant/invariant trên một loại paramter tại một thời điểm. Để được biến đổi hoặc bất biến, trong trường hợp này, trên tất cả các tham số kiểu của nó cùng một lúc không giữ bất kỳ ý nghĩa nào. Điều đó có nghĩa là gì?
Tiến lên. Để xác định xem kiểu generic có hợp lệ hay không, chúng ta kiểm tra các đối số kiểu của nó (không phải kiểu paramters). Vì vậy, nếu tham số kiểu tương ứng là covariant/contravariant/invariant, thì đối số kiểu là covariantly/contravariantly/invariantly hợp lệ tương ứng ...
Tôi cần quy tắc này được giải thích chi tiết hơn.
Chỉnh sửa: Cảm ơn Eric. Được đánh giá cao!
Tôi hoàn toàn hiểu ý nghĩa của giá trị covariantly/contravariantly/invariantly hợp lệ. Một loại là hợp lệ covriantly, nếu nó chắc chắn không contravariant, có nghĩa là nó có thể là bất biến. hoàn toàn ổn!
Đối với quy tắc thứ 4, bạn làm theo quy trình làm thế nào để xác định xem loại chung được xây dựng có hợp lệ đúng hay không, như được xác định trong quy tắc. Nhưng, làm thế nào để bạn xác định xem một đối số kiểu được khai báo là covariant (out) có hợp lệ không?
Ví dụ, trong giao diện được xây dựng khép kín Tôi {} của giao diện chung tôi {...}, nên không phải là thực tế rất rằng kiểu tranh luận object
được khai báo là một loại hiệp biến tham số (out U) trong khai báo giao diện chung có nghĩa là đối số đối số kiểu là covariant? Tôi nghĩ rằng nó nên. Cuz đó chính là định nghĩa của sự biến đổi.
Ngoài ra, các quy tắc thứ hai:
2) Một loại mảng T [] trong đó T là hợp lệ covariantly.
gì mảng yếu tố loại T
là hợp lệ covariantly nghĩa là gì? Bạn có nghĩa là loại phần tử là một loại giá trị (bất biến trong trường hợp này) hoặc loại tham chiếu (biến thể trong trường hợp này)?
Cuz phép chiếu T
→ T[]
chỉ là biến thể nếu T
là loại tham chiếu.
Thử lại? :) – Gjeltema
Nó thực sự không giống như Eric Lippert là mơ hồ hoặc mơ hồ. Tôi cho một người sẽ chờ anh ta cân nhắc trước khi kiểm tra chiều sâu của vũng nước nhỏ này. –
Bài đăng này là Gjeltema khác nhau. Trong bài trước của tôi về phương sai, sự hiểu biết của tôi về phương sai và các thuật ngữ dạng ngắn liên quan của nó đã được làm rõ. –