2012-04-05 48 views
19

Tôi vừa nhìn thấy một cú pháp quen thuộc trong khi tìm kiếm loại GroupBy trở lại:"Không" có nghĩa là gì trước thông số kiểu Chung?

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement> 

MSDN Source

Tôi biết những gì out nghĩa trong phương pháp, nhưng không phải trong một giao diện generics.

out có nghĩa là gì trong loại chung?

+1

Đó là một * Generic Modifier *. Xem MSDN http://msdn.microsoft.com/en-us/library/dd469487.aspx –

+3

với 12k rep cant ít nhất là nhìn vào [MSDN] (http://msdn.microsoft.com/en-us/library/ dd469487.aspx) trước khi hỏi? – Reniuz

+0

@Reniuz. Tôi thấy chỉ có tham chiếu 'out'. Xin lỗi ... – gdoron

Trả lời

9

Đây là một trong hai bộ sửa đổi chung giới thiệu trong C# 4.0 (Visual Studio 2010).

Nó biểu thị rằng tham số chung được khai báo là biến thể.

Công cụ sửa đổi in có nghĩa là thông số chung được khai báo là contravariant.

Xem out (Generic Modifier)in (Generic Modifier) trên MSDN.

+0

Tôi biết các điều khoản [contravariance và hiệp phương sai] (http://msdn.microsoft.com/en-us/library/ee207183.aspx), nhưng Ví dụ MSDN không mô tả các biến tố 'in' và' out' cho Generics rất rõ ràng theo ý kiến ​​của tôi. Bạn có thể đưa ra một số ví dụ dễ hiểu hơn không? – Matt

+1

Không có gì ngoài việc sao chép/dán từ MSDN. Câu trả lời của Frank nên được chấp nhận, không phải điều này. –

+0

@SergeyAkopov - Bạn chắc chắn được hưởng ý kiến ​​của bạn, nhưng chấp nhận hay không hoàn toàn là điều mà người hỏi câu hỏi quyết định. – Oded

4

out từ khóa trong ngữ cảnh này sẽ cho biết tham số kiểu tương ứng là biến thể đơn giản chỉ cần nói - hiệp phương sai cho phép bạn sử dụng loại có nguồn gốc cao hơn giá trị được chỉ định bởi tham số chung.

BTW, xem loạt mười phần này từ Eric Lippert để hiểu thêm về hiệp phương sai và contra-variance: http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx

5

ra chỉ có nghĩa là loại chỉ được sử dụng cho đầu ra ví dụ

public interface Foo<out T> 
{ 
    T Bar() 
} 

Cũng có một công cụ sửa đổi trong đó có nghĩa là loại chỉ được sử dụng cho đầu vào, ví dụ:

public interface Foo<in T> 
{ 
    int Bar(T x) 
} 

Chúng được sử dụng vì giao diện với trong là hiệp biến trong T và giao diện với ra là contravariant trong T.

+0

Tôi giả sử bạn có nghĩa là 'giao diện công cộng Foo ' (thay vì 'out') trong ví dụ thứ hai của bạn, tôi có đúng không? – Matt

+0

@Matt Rất tiếc, bạn nói đúng. Cảm ơn, cố định ngay bây giờ. –

+0

@ralzarek bạn có nó ngược: out là covariant và in contravariant – BaltoStar

14

Nó biểu thị một tham số covariant. Xem thêm phần mô tả trên MSDN. Về cơ bản nó nói, rằng IGrouping<Aderived, Bderived> thể được coi là IGrouping<Abase, Bbase>, do đó bạn có thể

IGrouping<Aderived, Bderived> gr = MakeGrouping(...); 
IGrouping<Abase, Bbase> grBase = gr; 

nếu Aderived là một giao diện hoặc một loại có nguồn gốc từ Abase. Đây là một tính năng có ích khi bạn muốn gọi một phương thức yêu cầu tham số kiểu IGrouping<Abase, Bbase>, nhưng bạn chỉ có một đối tượng thuộc loại IGrouping<Aderived, Bderived>. Trong trường hợp này, cả hai loại có thể được coi là tương đương do hiệp phương sai của các tham số kiểu của chúng.

Các vấn đề liên quan