2012-01-23 27 views
6

Tôi có biểu thức sau, trong đó a.AnswerId là loại long?. ReSharper cảnh báo về khả năng InvalidOperationException trong chức năng chọn. Có bao giờ một trường hợp mà điều này thực sự có thể xảy ra? (Góc-trường hợp cũng tốt quá)theo dõi cảnh báo R #: Có thể 'System.InvalidOperationException'

long[] ids = answers.Where(a => a.AnswerId.HasValue) 
        .Select(a => a.AnswerId.Value) 
        .ToArray(); 
+0

Bạn có thể theo dõi thời điểm các sự cố này được giải quyết bằng cách làm theo hai vấn đề này trên trình theo dõi vấn đề JetBrains: http://youtrack.jetbrains.net/issue/RSRP-213609 http://youtrack.jetbrains.net/issue/RSRP -200225 – AakashM

Trả lời

7

Vì bạn kiểm tra trong Where rằng a.AnswerId có một giá trị, a.AnswerId.Value sẽ không bao giờ ném một InvalidOperationException (trừ khi thread khác đang thay đổi dữ liệu cùng một lúc). Resharper có khả năng phân tích mã khá tốt, nhưng nó không thể phát hiện ra mọi thứ, và trong trường hợp này nó không nhận ra rằng Where làm cho nó an toàn để gọi .Value trong Select, do đó cảnh báo. Vì vậy, bạn có thể bỏ qua cảnh báo này một cách an toàn.

4

Thật không may, ReSharper thường xuất hiện với các kết quả dương tính giả. Trong trường hợp này, sẽ không có vấn đề gì miễn là AnswerId trả về cùng một giá trị trong các cuộc gọi tới WhereSelect. (Hãy chắc chắn rằng AnswerId không có một số triển khai điên rồ trả lại số lần đầu tiên bạn truy cập vào nó và null lần thứ hai.)

3

Thật không may, ReSharper không thể theo dõi kiểm tra tình trạng thông qua trình tự LINQ lambda. Đây là một vấn đề nổi tiếng.

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