Порядок инициализации статических параметровC#

Место общения программистов C#
Ответить
Anonymous
 Порядок инициализации статических параметров

Сообщение Anonymous »

Несколько недель назад я перешел с Java на C#. Сегодня у меня было странное поведение, и я пытаюсь воспроизвести его в этом простом примере. Я использую .net FW 4.

У меня есть три класса:
Во-первых, абстрактный:

Код: Выделить всё

namespace ReadonlyStaticOrder
{
using System;
using System.Collections.Generic;

public abstract class AbstractClass
{
public AbstractClass(string value, IEnumerable 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 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.ReadonlyOrderInitialization..ctor(String value)

в ReadonlyStaticOrder.Program.Main(String[] args) в
d:\stackoverflow\static
readonlyissue\ConsoleApplication1\ReadonlyStaticOrder\Program.cs:line
12


Я добавил комментарий к строке который вводит ошибку. Для меня компилятор должен был бы предупредить меня, что поведение может быть странным из-за порядка статической инициализации. Я ошибаюсь?

Спасибо, ребята, надеюсь, у вас достаточно информации.

Подробнее здесь: https://stackoverflow.com/questions/858 ... parameters
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»