Несколько недель назад я перешел с Java на C #.Сегодня у меня было странное поведение, и я пытаюсь воспроизвести его в этом простом примере.Я использую .net FW 4.
У меня есть три класса: первый, абстрактный:
namespace ReadonlyStaticOrder
{
using System;
using System.Collections.Generic;
public abstract class AbstractClass
{
public AbstractClass(string value, IEnumerable<string> someValues)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
if (someValues == null)
{
throw new ArgumentNullException("someValues");
}
// would do something after...
}
}
}
второй:
namespace ReadonlyStaticOrder
{
using System.Collections.Generic;
public sealed class ReadonlyOrderInitialization : AbstractClass
{
// this line introduces the bug, since it call the ctor before SomeValues already initialized
// if removed, no more exception
public static readonly ReadonlyOrderInitialization Sample = new ReadonlyOrderInitialization("sample");
private static readonly IEnumerable<string> SomeValues = new string[] { "one", "two", "three" };
public ReadonlyOrderInitialization(string value)
: base(value, SomeValues)
{
}
}
}
идемонстратор:
namespace ReadonlyStaticOrder
{
using System;
public sealed class Program
{
static void Main(string[] args)
{
try
{
new ReadonlyOrderInitialization("test");
}
catch (TypeInitializationException typeInitializationException)
{
Console.WriteLine(typeInitializationException.Message);
Console.WriteLine(typeInitializationException.InnerException.Message);
Console.WriteLine(typeInitializationException.StackTrace);
}
Console.ReadLine();
}
}
}
И вывод:
Инициализатор типа для ReadonlyStaticOrder.ReadonlyOrderInitialization выдал исключение.Значение не может быть нулевым.Имя параметра: someValues в ReadonlyStaticOrder.1016 *
Я добавил комментарий в строку, которая представляет ошибку.Для меня компилятор должен предупредить меня, что поведение может быть странным из-за порядка статической инициализации.Я не прав?
Спасибо, ребята, и я надеюсь, что у вас достаточно информации.