2013-09-21 53 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'。 –

相关问题