2017-10-13 13 views
5

Tôi bắt đầu thấy những phát biểu này và tôi đang cố gắng che đầu xung quanh những câu nói này.Cú pháp này làm gì? if (obj is SomeType obj2)

if (obj is SomeAuto car) 
{ 
    //Do stuff 
} 

Nếu tôi hiểu chính xác về cơ bản chúng tôi đang đúc obj vào ô có thể là loại "SomeAuto"?

1) Thuật ngữ chính thức của tuyên bố này là gì?

2) Điều gì sẽ xảy ra nếu tôi muốn thay đổi câu lệnh if thành thực thi có điều kiện vì một lý do cụ thể?

Ví dụ: SomeAuto là một lớp cơ sở và tôi chỉ muốn một loại tự động nhất định, hoặc nói rằng tôi muốn tất cả các SomeAuto ngoại trừ một loại cụ thể.

+0

Xem https://stackoverflow.com/questions/184681/is-vs-typeof –

+3

Dường như kiểu mẫu C# 7 khớp với: https://docs.microsoft.com/en-us/dotnet/csharp/ language-reference/keywords/is # type – UnholySheep

+0

UnholySheep đã trả lời 1), cho 2) bạn có thể sẽ cần một mẫu khác. – Fildor

Trả lời

6

Câu lệnh if này sử dụng biểu thức is được thêm vào trong C# 7.0 under pattern matching. Tài liệu chỉ định rằng:

Biểu thức mẫu là mở rộng toán tử quen thuộc để truy vấn đối tượng ngoài loại của nó.

Nó cho phép bạn kiểm tra xem obj có thuộc loại cụ thể không và cũng gán kết quả được đúc thành biến.


Trước khi các tính năng mà bạn có thể muốn viết:

var car = obj as SomeAuto; 
if(car != null) 
{ 
    //Do Stuff 
} 

Như đã chỉ ra bởi @BurnBA một sự khác biệt khi sử dụng as so với bản gốc isLưu ý rằng toán tử as thực hiện chỉ tham khảo chuyển đổi, chuyển đổi không thể thực hiện và chuyển đổi quyền anh là và do đó không thể được sử dụng để kiểm tra các loại giá trị không thể vô hiệu.

+0

eh, nhỏ caveat, 'as' chỉ hoạt động với kiểu tham chiếu, trong khi bạn có thể sử dụng' is' cho những thứ như 'int'. – BurnsBA

+0

@BurnsBA - Tốt bình luận. Nếu bạn có thể tham chiếu đến điều đó và tôi sẽ cập nhật câu trả lời của tôi cho phù hợp –

+2

" Nhà điều hành mạng không thể thực hiện các chuyển đổi khác, chẳng hạn như chuyển đổi do người dùng xác định, thay vào đó sẽ được thực hiện bằng cách sử dụng biểu thức truyền. "https: // docs. microsoft.com/en-us/dotnet/csharp/ngôn ngữ tham chiếu/từ khóa/như – BurnsBA

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