2012-08-17 34 views
6

Hiện đang làm việc trên một liên kết tra cứu 2 chiều chung chung, được sắp xếp theo TKey. Tại một thời điểm nào đó, tôi hy vọng có quyền truy cập như sau:Biên dịch có điều kiện của các phương pháp chung

public class Assoc<TKey, TValue> 
{ 
    public TKey this[TValue value] { get; } 
    public TValue this[TKey value] { get; } 
} 

Nhưng rõ ràng là khi TKey == TValue điều này sẽ thất bại. Ngoài sự tò mò, có cú pháp biên dịch có điều kiện để thực hiện điều này:

public class Assoc<TKey, TValue> 
{ 
    [Condition(!(TKey is TValue))] 
    public TKey this[TValue value] { get; } 

    [Condition(!(TKey is TValue))] 
    public TValue this[TKey value] { get; } 

    public TKey Key(TValue value) { get; } 

    public TValue Value(TKey value) { get; } 
} 
+0

Khi nào sử dụng lớp học với TKey == TValue hữu ích? – casablanca

+0

'TKey công khai '[giá trị giá trị truyền hình] {get; } 'làm gì? Tôi không hiểu mục đích của API này. –

+0

@casablanca, Bạn đã bao giờ sử dụng 'Từ điển '? Có vẻ như Jake muốn có một cái gì đó rất giống với một từ điển, nhưng với tìm kiếm kết hợp của cả khóa và giá trị. –

Trả lời

4

Không, không có sự kết hợp có điều kiện dựa trên loại Chung.

Thay thế Generics được thực hiện trong thời gian chạy, không phải thời gian biên dịch.

Đây là một trong những khác biệt giữa các tệp .NET Generics và C++.

Generics cũng không có khái niệm về chuyên môn mà mẫu C++ có.

http://msdn.microsoft.com/en-us/library/c6cyy67b.aspx

+2

+1. Lưu ý "Generics được giải quyết trong thời gian chạy, không biên dịch thời gian." không chính xác đúng - tại các phương thức biên dịch trong lớp chung cần phải được tìm thấy đúng (đó là lỗi chính xác mà lớp của Jake tạo ra khi trình biên dịch cố gắng chọn phiên bản của trình lập chỉ mục nào cần được sử dụng). –

+2

Đồng ý với @Alexei; vấn đề ở đây không liên quan gì đến hành vi thời gian chạy của generics. Đây là * hoàn toàn * một vấn đề về độ phân giải quá tải của phương thức, đây là một cấu trúc biên dịch thời gian. Đặc biệt, vấn đề là không có các bộ định tính (chẳng hạn như 'where TKey: Foo', vv) cả hai đều được trình biên dịch xử lý như' đối tượng' và do đó phương thức xử lý quá tải thông thường của phương thức bình thường - khi hai phương thức chia sẻ giống nhau Các kiểu tham số (tức là 'đối tượng') - khởi động. Đây là một kịch bản thời gian * biên dịch *. –

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