2013-09-21 108 views
1

在下面的代碼中,Resharper 8告訴我_myClasses有一個「Possible」System.NullReferenceException'「。這是一個在Resharper中的錯誤,或者是有什麼我錯過了這個代碼將如何工作?我的理解是,只讀修飾符使得它只能設置_myClasses一次,而我設置它的一件事就是某個事物的實例。什麼情況下可以爲空?爲什麼resharper認爲私有隻讀變量可以爲null?

private readonly IList<MyClass> _myClasses = new List<MyClass>(); 

void Foo() 
{ 
    _myClasses.Clear(); // Possible 'System.NullReferenceException' 
} 
+0

在第一次初始化爲空的情況下 – Damith

回答

2

readonly意味着 「構造完成後不能改變」。所以任何構造函數都可以將其值更改爲null(現在或未來寫入的構造函數)。

...聲明引入的字段賦值只能作爲聲明的一部分或在同一個類的構造函數中出現。

樣品:

class Foo 
{ 
    private readonly string myClasses = "test"; 

    public Foo(int value) { }  
    public Foo(string text) { myClasses = text;}  
    public Foo() 
    { 
    myClasses = null; 
    Bar(); 
    } 

    void Bar() 
    { 
    if (myClasses == null) 
    { 
    Console.WriteLine("Null???"); 
    } 
    } 
} 

在樣品上方Foo()構造將設置myClassesnull和殼體異常,如果一個依賴於該值不能爲空。

+0

我錯過的關鍵是我沒有意識到readonly可以設置多次。我認爲它只能在構造函數中設置,並且只能在此期間設置一次。 –

+0

問題是,即使你沒有'Foo()'構造函數(即沒有辦法將該成員設置爲'null'),Resharper仍會告訴你該成員可能是'null'。 –

相關問題