Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why Collection Initialization Throws NullReferenceException

The following code throws a NullReferenceException:

internal class Foo
{
    public Collection<string> Items { get; set; } // or List<string>
}

class Program
{
    static void Main(string[] args)
    {
        new Foo()
            {
                Items = { "foo" } // throws NullReferenceException
            };
    }
}
  1. Why don't collection initiliazers work in this case, although Collection<string> implements the Add() method, and why is NullReferenceException is thrown?
  2. Is it possible to get the collection initializer working, or is Items = new Collection<string>() { "foo" } the only correct way to initialize it?
like image 738
Vladimir Dorokhov Avatar asked Mar 19 '23 11:03

Vladimir Dorokhov


2 Answers

Thanks guys. As summary collection initializer doesn't create instance of collection itself, but just uses Add() to add items to existant instance, and throws NullReferenceException if instance doesn't exist

1.

internal class Foo
{    
    internal Foo()
    {
        Items  = new Collection<string>();
    }
    public Collection<string> Items { get; private set; }
}

var foo = new Foo()
                {
                    Items = { "foo" } // foo.Items contains 1 element "foo"
                };

2.

   internal class Foo
    {    
        internal Foo()
        {
            Items  = new Collection<string>();
            Items.Add("foo1");
        }
        public Collection<string> Items { get; private set; }
    }

    var foo = new Foo()
                    {
                        Items = { "foo2" } // foo.Items contains 2 elements: "foo1", "foo2"
                    };
like image 124
Vladimir Dorokhov Avatar answered Mar 22 '23 01:03

Vladimir Dorokhov


You never instantiated Items. Try this.

new Foo()
    {
        Items = new Collection<string> { "foo" }
    };

To answer your second question: You need to add a constructor and initialize Items over there.

internal class Foo
{    
    internal Foo()
    {
        Items  = new Collection<string>();
    }
    public Collection<string> Items { get; private set; }
}

Why your code throws NullReferenceException?

like image 25
Sriram Sakthivel Avatar answered Mar 22 '23 00:03

Sriram Sakthivel