2010-09-09 9 views
8

Ai đó có thể giải thích những gì đang xảy ra ở đây? Howcome cả hai những điều này là đúng?LINQ Tổng hợp hành vi của các loại có thể vô hiệu

[TestMethod] 
public void WhatIsGoingOnHere() 
{ 
    List<int?> list = new List<int?> { 1, 2, 3, null, 5, 6 }; 
    Assert.AreEqual(17, list.Sum()); 

    int? singleSum = 1 + 2 + 3 + null + 5 + 6; 

    Assert.IsNull(singleSum); 
} 

Cụ thể, tại sao phương thức Sum() không trả về 'null'? Hoặc singleSum không bằng 17?

+0

+1 Câu hỏi thú vị! –

Trả lời

4

Điều bạn đang thấy là sự khác biệt giữa việc sử dụng Enumerable.Sum và thực sự tự thêm các giá trị.

Điều quan trọng ở đây là null không phải là số không. Thoạt nhìn, bạn sẽ nghĩ rằng singleSumnên bằng 17 nhưng điều đó có nghĩa là chúng tôi sẽ phải gán các ngữ nghĩa khác nhau cho null dựa trên loại dữ liệu của tham chiếu. Thực tế rằng đây là một int? không có sự khác biệt - nullnull và không bao giờ nên bằng ngữ nghĩa bằng hằng số số 0.

Việc triển khai Enumerable.Sum được thiết kế để bỏ qua bất kỳ giá trị nào là null theo thứ tự sao cho bạn thấy hành vi khác nhau giữa hai thử nghiệm. Tuy nhiên thử nghiệm thứ hai trả về đúng null vì trình biên dịch đủ thông minh để biết rằng thêm bất kỳ thứ gì vào null sản lượng null.

Đây là việc thực hiện Enumerable.Sum chấp nhận một tham số của int?:

public static int? Sum(this IEnumerable<int?> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    int num = 0; 
    foreach (int? nullable in source) 
    { 
     // As you can see here it is explicitly designed to 
     // skip over any null values 
     if (nullable.HasValue) 
     { 
      num += nullable.GetValueOrDefault(); 
     } 
    } 
    return new int?(num); 
} 
+0

Tôi hoàn toàn nhận được lý do tại sao singelSum là null, không 17 - bởi vì null chỉ là null ... hoàn toàn với bạn ở đó :) Tôi đoán câu hỏi của tôi là nhiều hơn, howcome Sum() đã không trả về null, quá ... – kiwipom

6

Phương pháp .Sum() các loại nullable bỏ qua tất cả null giá trị:

MSDN:Enumerable.Sum Method (IEnumerable<Nullable<Int32>>)

chú

kết quả này không bao gồm giá trị là null.

Trong khi nếu bạn thêm bất kỳ số qua + để null kết quả là null.

Như Andrew Hare đã lưu ý, việc thêm số vào null: null không phải là 0; nó không chỉ là một con số.

+0

nhờ liên kết ... có vẻ như nó hoạt động như thế nào. Tôi nhận được rằng bây giờ - cổ vũ :) – kiwipom

+0

thực sự xin lỗi tôi không thể đánh dấu cả hai câu trả lời là chính xác ... 1 từ tôi, dù sao đi nữa! cảm ơn – kiwipom