2017-06-22 24 views
6

Có thể sử dụng bộ dữ liệu với mô hình kết hợp trong báo cáo chuyển đổi bằng C# 7 như sau:C# 7 Pattern Match với một tuple

switch (parameter) 
{ 
    case ((object, object)) tObj when tObj.Item1 == "ABC": 
     break; 
} 

tôi nhận được một lỗi mà nói tObj does not exist in the current context.

Tôi đã cố gắng này là tốt:

switch (parameter) 
{ 
    case (object, object) tObj when tObj.Item1 == "ABC": 
     break; 
} 

này hoạt động tốt:

switch (parameter) 
{ 
    case MachineModel model when model.Id == "123": 
     break; 
} 

Trả lời

8

Hãy nhớ rằng C# 7 tuples là đường chỉ là cú pháp, vì vậy (object, object) thực sự chỉ System.ValueTuple<object, object> là.

Tôi đoán rằng đội dev đã không mất tình hình đặc biệt này vào tài khoản cho các cú pháp mới cho các bộ, nhưng bạn có thể làm điều này:

switch (parameter) 
{ 
    case System.ValueTuple<object, object> tObj when tObj.Item1 == "x": 
     break; 
} 

Ngoài ra, kể từ khi "var mẫu" sẽ phù hợp với bất cứ điều gì và tôn trọng loại, ở trên có thể được đơn giản hóa thành:

switch (parameter) 
{ 
    case var tObj when tObj.Item1 == "x": 
     break; 
} 
+2

@DavidArno Cảm ơn bạn đã chỉnh sửa, nhưng có một vấn đề với việc sử dụng 'var'. Nếu 'tham số' là kiểu' đối tượng' và câu lệnh chuyển đổi cũng đang được sử dụng để kiểm tra kiểu, nó sẽ thất bại. [Ví dụ] (https://gist.github.com/WiredUK/21d1a61c01580a2fe7b055ec83b46889) – DavidG

+0

Điểm tốt. Tôi đã giả định từ câu hỏi rằng 'tham số' là một tuple, nhưng đó có thể là một giả định tồi tệ để thực hiện. –

+2

@DavidArno Tôi nghĩ rằng nó gần như chắc chắn là, đó là lý do tại sao tôi đã không chỉnh sửa chỉnh sửa của bạn. Chỉ cần nghĩ rằng nó là đáng nói đến ở đây. – DavidG