2012-07-11 39 views
6

Hãy xem xét đoạn mã này:Tại sao lambdas trong C# dường như xử lý các giá trị trả về boolean khác nhau?

Func<int, bool> TestGreaterThanOne = delegate(int a) { 
       if (a > 1) return (true); 
       else return(false); 
       }; 

Trong đoạn mã trên, tôi không thể xóa các "else return (false)" tuyên bố - trình biên dịch cảnh báo rằng không phải tất cả đường dẫn mã trả về một giá trị. Nhưng trong đoạn mã sau, trong đó sử dụng một lambda ...

Func<int, bool> TestGreaterThanOne = a => a > 1; 

Tôi không phải có câu lệnh "khác" - không có cảnh báo trình biên dịch và logic hoạt động như mong đợi.

Cơ chế nào đang được chơi ở đây để làm cho tôi không có tuyên bố "khác" trong lambda của tôi?

+0

Chỉ cần làm rõ, biểu thức lambda không có bất kỳ cách xử lý đặc biệt nào của bool cụ thể. Bạn có thể viết phiên bản 'delegate' theo cách tương tự như Raymond Chen thực hiện bên dưới. Đặc điểm lambda duy nhất ở đây là thiếu chỉ định 'return' cho câu lệnh nội tuyến, trong đó giá trị trả về có thể được suy ra (như trong ví dụ của bạn). –

Trả lời

21

Bởi vì trong cách viết tắt lambda của bạn, cũng không có câu lệnh if. Chữ viết tắt lambda của bạn tương đương với

Do đó tất cả các đường dẫn mã trả về một giá trị.

+0

à, tất nhiên rồi. Tôi có thể thấy điều đó ngay bây giờ. Cảm ơn bạn. –

2

Để thêm một chút cho các phản hồi khác, trong tuyên bố lambda của bạn, a > 1 đánh giá thành boolean, sau đó được trả lại.

Nói chung, viết các câu hỏi return true;return false; được coi là dư thừa. Nó đơn giản hơn để chỉ trả lại bất cứ điều gì biểu thức đánh giá.

0

Tôi không nghĩ rằng chúng đang xử lý các giá trị boolean khác nhau trong trường hợp bạn đề cập đến. Mã chỉ làm hai việc khác nhau. Vì bạn xác định FuncFunc<int, bool>, nó yêu cầu giá trị trả về boolean. Đoạn mã thứ hai luôn trả về một boolean. Tuy nhiên, đoạn mã đầu tiên không trả về một boolean trừ khi bạn bao gồm phần tử khác.

0

a>1 chính nó là một boolean, và đó là lý do tại sao lambda của bạn hoạt động. bạn gần như có thể nghĩ đến một câu lệnh if như một chức năng mà phải mất một tham số boolean, vì vậy, bạn có thể làm một cái gì đó giống như

boolean b = true 

if(b) 
    doSomething(); 

và nó sẽ biên dịch và thực thi doSomething

1

Như thay thế cho việc viết lại các đại biểu, bạn trừu tượng lambda tương đương với

Func<int, bool> TestGreaterThanOne = a => { 
      if (a > 1) return (true); 
      else return(false); 
      }; 

Nơi bạn cũng không thể xóa nhánh khác. Bởi vì nó sẽ không trở lại. Phiên bản hiện tại hoạt động vì a > 1 là một giá trị boolean (luôn luôn hiện diện).

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