2016-03-15 28 views
1

如果這個問題有點過分強調,我很抱歉,但是我確實喜歡我的代碼在resharper告訴我的地方不要有任何下襬線。Resharper:可能將空值賦值給標記爲「NotNull」屬性的實體

我有一個通用的清單:

var permissions = new List<Permission>(); 

在代碼中的某些時候,我需要測試的第一個元素:

if (permissions.First().ImportID == this.ImportId) 
{ 
    // do stuff 
} 

ReSharper的(正確地)抱怨權限可能爲空,所以我接受它的建議並添加一張支票:

if (permissions != null && permissions.First().ImportID == this.ImportId) 
{ 
    // do stuff 
} 

現在我意識到我需要防範列表是空的,所以我在那裏也添加一個檢查任何:

if (permissions != null && permissions.Any() && permissions.First().ImportID == this.ImportId) 
{ 
    // do stuff 
} 

和生活是美好的,代碼工作& ReSharper的是安靜。認識到空+任何()檢查將被用於經常我添加一個擴展方法:

public static bool IsEmpty<T>(this IEnumerable<T> source) 
{ 
    if (source == null) 
     return true; 
    return !source.Any(); 
} 

唯一的問題是現在,當我使用這個:

if (!permissions.IsEmpty() && permissions.First().ImportID == this.ImportId) 

ReSharper的重新開始呻吟「對標有」NotNull「屬性的實體可能爲null賦值」。

那麼,是否有一種方法讓resharper知道在執行IsEmpty()之後權限永遠不會爲null(以同樣的方式理解!= null的作用)還是我唯一的選項來忽略該消息。

回答

5

我懷疑你可以使用R# annotation這個。喜歡的東西:

[ContractAnnotation("null => true")] 
public static bool IsEmpty<T>(this IEnumerable<T> source) 
{ 
    return source == null || !source.Any(); 
} 

我相信應該生成R#足夠的信息來制定出你不是試圖用一個空引用如果IsEmpty回報false

+0

謝謝喬恩,你的懷疑是完全正確的。我的代碼下面沒有更多的虛線,我很高興。謝謝 – Lobsterpants