понедельник, 15 июля 2024 г.

Что не так с Activator.CreateInstance(Type) ?

  Будьте аккуратны при использовании Activator.CreateInstance(Type). Он может вернуть null


  Для справкиActivator.CreateInstance(Type) позволяет создать экземпляр типа, не зная тип во время компиляции. Например, можно создать экземпляр типа на основе файла конфигурации или ввода пользователя. Всегда, когда нельзя использовать ключевое слово new, вы можете использовать Activator.CreateInstance(Type).

  Но есть одна маленькая особенность: все мы ожидаем на выходе получить не-null объект, поскольку явно запрашиваем создание нового экземпляра, но это не всегда так. Для типов Nullable<T> Activator.CreateInstance(Type) возвращает значение null.

object? value = Activator.CreateInstance(typeof(int?));
Console.WriteLine(value is null); // true

Стоит отметить, что такое же поведение наблюдается при использовании ключевого слова new:

object? value = new int?();
Console.WriteLine(value is null); // true

Однако можно использовать оператор подавления null (!), чтобы подавить предупреждение о том, что значение может быть null, если уверены, что тип не может быть Nullable<T>:

object? value = Activator.CreateInstance(typeof(object))!;
Console.WriteLine(value.GetHashCode());
Console.WriteLine(value is null); // всегда false

Источник:
https://www.meziantou.net/activator-createinstance-type-may-return-null.htm