2013-10-31 12 views
16

Gần đây tôi đã tìm ra rằng bạn có thể sử dụng chú thích [CanBeNull] trong C# để báo cho ReSharper (và các phần bổ trợ khác) rằng một phương thức có thể trả về giá trị rỗng. Điều này là tuyệt vời, bởi vì nó làm cho ReSharper nhắc nhở tôi khi tôi không xử lý những tình huống đó.CanBeNull và ReSharper - sử dụng nó với Công việc không đồng bộ?

Tuy nhiên, đối với async các phương thức trả lại Task hoặc Task<T>, hành vi này không mong muốn.

Ví dụ, hãy xem xét ví dụ sau:

[CanBeNull] 
public async Task<string> GetSomeName() { 
    var time = DateTime.Now; 
    if(time.Second == 30) { 
     return "Jimmy"; 
    } else { 
     return null; 
    } 
} 

Tôi biết rằng kịch bản này là một chút lạ, nhưng vì đơn giản, gấu với tôi. Nếu tôi (với ReSharper kích hoạt) sau đó cố gắng gọi phương thức ở nơi khác, nó cảnh báo không chính xác. Ví dụ:

var myValue = await GetSomeName(); 
var subValue = myValue.Trim(); //here, ReSharper should warn me that subValue is null. 

Ở đây, ReSharper cảnh báo tôi ở vị trí không chính xác. Dòng đầu tiên tạo ra một cảnh báo (và nó tuyên bố rằng bản thân nhiệm vụ thực sự có thể là null, điều đó là sai). Dòng thứ hai không tạo ra cảnh báo, đó là nơi cảnh báo nên có.

Nếu tôi được thực hiện theo ReSharper hoàn toàn, mã này sẽ phải được viết:

var myTask = GetSomeName(); 
if(myTask != null) { 
    //this is silly, and is always true, but ReSharper thinks that the Task can be null due to the CanBeNull attribute. 

    var myValue = await myTask; 
    var subValue = myValue.Trim(); //this could generate an error, but ReSharper doesn't warn me. 

} 

Đây có phải là một lỗi với ReSharper mà tôi phải nộp? Hay tôi đang sử dụng chú thích không chính xác? Tôi đoán tất cả chúng ta có thể đồng ý rằng nhiệm vụ chính nó không bao giờ có thể là null, vì vậy tôi không biết điều này có ý nghĩa như thế nào.

+1

tôi khuyên bạn gửi nó như là một lỗi để Re # (về mặt lịch sử, họ đã chậm chạp trong việc làm việc với 'async', và họ vẫn có rất nhiều câu hỏi nếu bạn sử dụng 'async' trong PCL). Chúng có thể không thay đổi được 'CanBeNull', nhưng ít nhất chúng cũng có thể tạo một' CanBeNullAsync'. –

+0

Vâng 'CanBeNull' không phải là phát minh của họ. Nó là một phần của C#. –

+0

Trong trường hợp đó, bạn có thể yêu cầu nhóm BCL hướng dẫn. –

Trả lời

23

Ivan Serduk nói: "Bắt đầu từ ReSharper 9,2 EAP4 thuộc tính [ItemCanBeNull][ItemNotNull] có thể được áp dụng cho các đối tượng của loại hình 'công tác' và 'Lazy' . nó hoạt động hoàn hảo!

PS Xin đừng quên cập nhật Jetbrains Chú thích.

7

Bạn đã đạt đến giới hạn phân tích giá trị null của ReSharper. Nó đang cố gắng xử lý giá trị trả về (nhiệm vụ) như là giá trị null, chứ không phải là kết quả. Tuy nhiên, đó là một yêu cầu tính năng tuyệt vời - Tôi muốn đề nghị bỏ phiếu cho vấn đề này: http://youtrack.jetbrains.com/issue/RSRP-376091

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