2010-08-29 13 views
7

Điều này khiến tôi khá bối rối. Có lẽ tôi đang quá mệt mỏi ngay bây giờ.Hành vi lạ với toán tử có điều kiện trong .Net

Rectangle rectangle = new Rectangle(0, 0, image.Width, image.Height); 
    Rectangle cropArea = inputArea == null ? rectangle : inputArea.Value; 

    if (inputArea == null) 
     cropArea = rectangle; 

đầu vàoArea là một hình chữ nhật không có giá trị, trong trường hợp cụ thể của tôi là null.

Hai câu lệnh đầu tiên mang lại một cropArea được khởi tạo thành 0. Thứ hai, tuy nhiên, tạo ra cropArea đúng dựa trên chiều rộng và chiều cao của hình ảnh. Tôi đã hiểu lầm bất cứ điều gì với các nhà điều hành có điều kiện? Có vẻ như nó không trả về hình chữ nhật khi inputArea = null? Có bất kỳ quirks khi làm việc với các loại giá trị?

EDIT: Được rồi, tôi đã thử lần đầu tiên: khởi động lại VS. Có vẻ như trình gỡ lỗi đã nói dối tôi, hay cái gì đó. Dù sao, hoạt động ngay bây giờ. Cảm ơn.

+0

Tôi nghĩ về việc để nó như một gợi ý cho bất kỳ ai khác mà khởi động lại VS luôn có thể giải quyết các vấn đề bất ngờ. Bạn nghĩ sao? – Max

+0

Ai là địa ngục downvoted câu hỏi này ??? Nó là một câu hỏi hoàn toàn hợp lệ phơi bày một lỗi khủng khiếp trong Visual Studio. –

+0

Là một sang một bên, lưu ý rằng bạn có thể sử dụng toán tử kết hợp null thay vì toán tử điều kiện ở đây: croparea = inputArea ?? hình chữ nhật; –

Trả lời

1

Điều đó có vẻ như một lỗi khó chịu trong chế độ gỡ lỗi Visual Studio được lừa dối bạn:

alt text

Bây giờ F10 bước qua dòng này và bạn sẽ có được:

alt text

Trên bàn điều khiển, các giá trị chính xác được in.

WTF.

+0

Bạn đã thử Nullable

+0

@JeremySpouken, biến nào? –

+1

@JeremySpouken: Tương đương với 'Hình chữ nhật?'. – Timwi

0
Rectangle cropArea = (!inputArea.HasValue) ? rectangle : inputArea.Value; 
+1

Điều đó tương đương. – Timwi

+0

Bây giờ, tại sao spam trên * my * thread fellas :) @Hitech Hình chữ nhật? inputArea = null; Nullable inputArea2 = null; @TimWi - bây giờ tại sao downvote .. chỉ là cố gắng giúp OP? – StuartLC

+0

+1 vì tôi đã nhầm lẫn với bài đăng của bạn và bắt đầu một cuộc chiến tranh nhỏ lửa. Hóa ra nó chỉ là lớp Silverlight Rectange mà không phải là nullable. –

0

Mã của bạn xuất hiện chính xác. Biểu thức điều kiện (hoặc toán tử điều kiện, hoặc ban đầu được gọi là toán tử bậc ba ... tất cả mọi người hạnh phúc bây giờ? :)) nên hoán đổi cho nhau với câu lệnh if/else.

Rectangle cropArea = inputArea == null ? rectangle : inputArea.Value; 

nên giống hệt nhau như:

Rectangle cropArea; 
if (inputArea == null) 
{ 
    cropArea = rectangle; 
} 
else 
{ 
    cropArea = inputArea.Value; 
} 

(trong thực tế, họ cần tạo mã IL giống nhau).

Theo dõi bằng trình gỡ lỗi và xem có bất cứ điều gì nhảy ra ngoài với bạn hay không.

+0

Vui lòng không gọi toán tử có điều kiện là "toán tử bậc ba". Tôi đã chỉnh sửa câu trả lời của bạn để sửa lỗi này, tôi hy vọng bạn không phiền. – Timwi

+0

@Timwi: Bạn cũng cần phải phàn nàn với trang web jQuery ngay bây giờ. Họ cũng gọi nó là toán tử bậc ba (ngôn ngữ khác, cùng toán tử) :) http://learn.jquery.com/javascript-101/conditional-code/ –

0

Vậy bạn nói rằng khi inputAreanull, mà không có tuyên bố if bạn nhận được một hình chữ nhật khởi tạo cái gì khác hơn so với kích thước hình ảnh? Tôi chỉ cố gắng chạy nó và nó hoạt động tốt. Đảm bảo rằng image có kích thước và inputArea thực sự là null.

+0

Có, tất cả đều có vẻ rất lạ, cho đến khi tôi nhận ra visual studio nói dối tôi. Xem chỉnh sửa của tôi. – Max

+0

@Max: Có lẽ đó là một điều tốt mà tôi đã không sử dụng VS, sau đó. –

-1

Cái quái gì?

Rectangle rectangle = ...; 
Rectangle cropArea; 
if (inputArea == null) 
    cropArea = rectangle; 
else 
    cropArea = inputArea.Value; 

if (inputArea == null) 
    cropArea = rectangle; 

Tại sao thứ hai nếu? Nó hoàn toàn và hoàn toàn dư thừa. Kịch bản trong đó cropArea có thể vẫn là null hoặc không là nếu inputArea.Value là null/zero, vì bạn không kiểm tra điều đó (chỉ khi inputArea là null).