2017-06-25 16 views
8

Có lý do nào để không thể xử lý biến chung theo kiểu mẫu không? Vui lòng xem xét mã:Kết hợp mẫu chữ hoa C# 7.0 trên tham số chung

public static int CompareValues<T>(T left, T right) 
{ 
    switch (left) 
    { 
    case IComparable<T> comparableDif: 
     return comparableDif.CompareTo(right); 
    case System.Numerics.Complex c: 
     return c.Magnitude 
     .CompareTo(((System.Numerics.Complex)(object)right).Magnitude); 
    default: 
     throw new ArgumentException("unsupported type"); 
    } 
} 

Kết hợp đầu tiên trên giao diện IComparable là ok, nhưng giao diện thứ hai không biên dịch. Tại sao tôi phải sử dụng cách giải quyết quyền anh này?

case object o when o is System.Numerics.Complex: 
    return ((System.Numerics.Complex)o).Magnitude 
    .CompareTo(((System.Numerics.Complex)(object)right).Magnitude); 
+0

Bạn đang chuyển đổi giá trị của thông số, chứ không phải loại. –

+5

Vì lý do tương tự, dàn diễn viên của 'phải' yêu cầu một hoạt động quyền anh. Không thực sự là một diễn viên từ một loại chung tùy ý T to Complex. Nó có thể upcast để đối tượng (và do đó hộp một struct) và sau đó cố gắng unbox nó như là phức tạp. Trong trường hợp đầu tiên, 'IComparable ' là một giao diện và luôn có khả năng cố gắng truyền sang giao diện (và do đó gắn bất kỳ cấu trúc nào) –

+4

@DavideVitali với khớp mẫu C# 7, nó có thể vừa là giá trị vừa là thiên nhiên –

Trả lời

9

Đây là một hệ quả của cách mô hình kết hợp trong C# 7.0 được xác định: đối với kiểu dữ liệu mẫu của bạn để biên dịch, một dàn diễn viên T-Complex sẽ phải tồn tại, nhưng nó không. Nhóm C# nhận ra đó là một sai lầm khi yêu cầu điều này, vì vậy this issue was fixed in C# 7.1.

+0

https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.1/generics-pattern-match.md –

+0

@ ГригорийШуренков Xin cảm ơn, đã cập nhật. (Đối với hồ sơ, bạn có thể đã đề xuất bản chỉnh sửa để tự sửa liên kết.) – svick

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