2014-12-20 25 views
8

Sử dụng ReSharper 8.2 tôi nhận được một cảnh báo ("Biểu hiện luôn là false") cho việc kiểm tra null trongReSharper: Null kiểm tra luôn là cảnh báo sai

public bool TryGetValue(TKey key, out TValue value) 
{ 
    if (key == null) 

từ NHibernate NullableDictionary. Tại sao điều này? Khi tôi dùng thử với

class Test<T> where T : class 

thì tôi không nhận được cảnh báo để kiểm tra null trên biến T như mong đợi.

Edit: Để làm cho mọi việc dễ dàng hơn ở đây là chữ ký lớp của nguồn liên kết:

public class NullableDictionary<TKey, TValue> : IDictionary<TKey, TValue> where TKey : class 
+0

Chuẩn 'Từ điển' ném một ArgumentNullException nếu khóa là rỗng, nhưng có vẻ như việc triển khai này cho phép' null'.Nó có một cái gì đó để làm với việc thực hiện giao diện 'IDictionary', nhưng tôi không chắc liệu ReSharper có đúng hay không, hoặc nếu nó đưa ra giả định không chính xác. –

Trả lời

9

Nó xảy ra bởi vì các lớp thực hiện IDictionary<TKey, TValue>; cảnh báo sẽ biến mất nếu bạn (tạm thời) xóa phần giao diện của chữ ký lớp.

Vì "khóa" trong lớp tiêu chuẩn System.Collections.Generic.Dictionary không bao giờ có thể là null (nó ném một số ArgumentNullException), tôi muốn nói rằng ReSharper đang tạo giả định không chính xác.


Kiểm tra các hành vi:

Tôi đã thử nghiệm lớp học trong một dự án khác rỗng và cố gắng nó ra. Mặc dù ReSharper đã tô xám tất cả các mã, nhưng nó vẫn được thực thi khi chạy.

Văn bản màu xám cho biết ReSharper tin rằng logic sẽ luôn bỏ qua khối else, nhưng rõ ràng không phải như vậy khi bạn sử dụng.

enter image description here


Một sửa chữa, sử dụng Chú thích:

Để khắc phục vấn đề ReSharper giả theo mặc định rằng chìa khóa không thể null, bạn có thể sử dụng JetBrains Chú thích.

Thêm tham chiếu vào cụm Chú thích JetBrains. Đối với tôi, đây là vị trí:

C: \ Program Files (x86) \ JetBrains \ ReSharper \ v8.2 \ Bin \ JetBrains.Annotations.dll

Sau đó thêm một chỉ thị sử dụng để phía trên cùng của tập tin mà lớp là:

using JetBrains.Annotations; 

Bây giờ đánh dấu rằng tham số với các thuộc tính CanBeNull và bạn sẽ thấy ReSharper không còn màu xám ra văn bản:

public bool TryGetValue([CanBeNull] TKey key, out TValue value) 

enter image description here

+0

Nhưng trong một NullableDictionary nó có thể. Vì vậy, tôi đoán ReSharper hy vọng rằng một implemetor của IDictionary dính vào nguyên tắc mà tại thời gian chạy khóa không được null. – user764754

+0

Đã cập nhật câu trả lời của tôi sau khi thử nghiệm. –

+0

@ user764754 Tôi đã tìm ra một cách xung quanh nó, nếu bạn quan tâm. –

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