As you know, it is not allowed to use the Array-initialisation syntax with Lists. It will give a compile-time error. Example:
List<int> test = { 1, 2, 3}
// At compilation the following error is shown:
// Can only use array initializer expressions to assign to array types.
However today I did the following (very simplified):
class Test
{
public List<int> Field;
}
List<Test> list = new List<Test>
{
new Test { Field = { 1, 2, 3 } }
};
The code above compiles just fine, but when run it will give a “Object references is not set to an object” run-time error.
I would expect that code to give a compile-time error. My question to you is: Why doesn’t it, and are there any good reasons for when such a scenario would run correctly?
This has been tested using .NET 3.5, both .Net and Mono compilers.
Cheers.
I think this is a by-design behavior. The
Test = { 1, 2, 3 }is compiled into code that callsAddmethod of the list stored in theTestfield.The reason why you’re getting
NullReferenceExceptionis thatTestisnull. If you initialize theTestfield to a new list, then the code will work:It is quite logical – if you write
new List<int> { ... }then it creates a new instance of list. If you don’t add object construction, it will use the existing instance (ornull). As far as I can see, the C# spec doesn’t contain any explicit translation rule that would match this scenario, but it gives an example (see Section 7.6.10.3):A
List<Contact>can be created and initialized as follows:which has the same effect as
where
__c1and__c2are temporary variables that are otherwise invisible and inaccessible.