«Инициализатор типа выдал исключение», хотя статические поля инициализированыC#

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

Сообщение Anonymous »

Я получаю исключение TypeInitializationException при запуске этого кода C#.

Это происходит, когда конструктор пытается добавить экземпляр в статический список, который уже должен быть инициализирован.
Вы можете запустить его здесь:

https://www.programiz.com/online-compiler/7Z2b1vggBclrq

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

using System;
using System.Collections.Generic;

public class Program
{
public static void Main()
{
Console.WriteLine("Hello");
Base baseClass = Base.getElement("test1");
}
}

public class Derived : Base
{
public static Derived derived_1 = new Derived("test1");
public static Derived derived_2 = new Derived("test2");
public static Derived derived_3 = new Derived("test3");
public static Derived derived_4 = new Derived("test4");

protected Derived(string field1) : base(field1)
{
}
}

public class Base
{
public static List list;
public static Base[] derivedClass;

static Base()
{
list = new List();
derivedClass = new Base[]
{
Derived.derived_1,
Derived.derived_2,
Derived.derived_3,
Derived.derived_4
};
}

public string field1;

protected Base(string field1)
{
this.field1 = field1;
list.Add(this); // list is null here
}

public static Base getElement(string field1)
{
foreach (var element in list)
{
if (element.field1.Equals(field1))
{
return element;
}
}
return null;
}
}
Вывод

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

ERROR!

Unhandled Exception:
System.TypeInitializationException: The type initializer for 'Base' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Derived' threw an exception. ---> System.NullReferenceException: Object reference not set to an instance of an object
at Base..ctor (System.String field1) [0x0000f] in :0
at Derived..ctor (System.String field1) [0x00000] in :0
at Derived..cctor () [0x00000] in :0
--- End of inner exception stack trace ---
--- End of inner exception stack trace ---
at Program.Main () [0x0000c] in :0
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: The type initializer for 'Base' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Derived' threw an exception. ---> System.NullReferenceException: Object reference not set to an instance of an object
at Base..ctor (System.String field1) [0x0000f] in :0
at Derived..ctor (System.String field1) [0x00000] in :0
at Derived..cctor () [0x00000] in :0
--- End of inner exception stack trace ---
--- End of inner exception stack trace ---
at Program.Main () [0x0000c] in :0
Смущает то, что статические поля (список и производный класс) явно инициализируются в статическом конструкторе, но когда list.Add(this) запускается внутри базового конструктора, list по-прежнему имеет значение null.
Для контекста: этот же шаблон работает в Java, но в C# он выдает ошибку во время статической инициализации.
Вопрос:
Почему это вызывает исключение TypeInitializationException, хотя статические поля инициализированы?

Подробнее здесь: https://stackoverflow.com/questions/798 ... e-initiali
Ответить

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

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

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

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

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