Обнуляемые ссылочные типы и шаблон параметров - PullRequest
6 голосов
/ 24 сентября 2019

Как мы можем использовать ненулевые ссылочные типы в сочетании с шаблоном опций ?

Допустим, у нас есть модель опций с именем MyOptions.

Службы, требующие этих опций, вводятся IOptions<MyOptions> options в конструктор.

Настройка опций происходит на IServiceCollection следующим образом:

services
    .AddOptions<MyOptions>()
    .Configure(options =>
    {
        options.Name = "ABC";
    });

Теперьпроблема в определении MyOptions:

public sealed class MyOptions
{
    public string Name { get; set; }
}

, которое генерирует предупреждение:

CS8618 Необнуляемое свойство 'Name' неинициализировано.Подумайте об объявлении свойства как обнуляемого.

  1. Мы не хотим делать обнуляемым Name, так как тогда нам нужно везде ставить традиционные проверки на ноль (что противоречит цели ненулевые ссылочные типы )
  2. Мы не можем создать конструктор, обеспечивающий создание класса MyOptions с ненулевым значением name, поскольку метод Configure создает параметрыэкземпляр для нас
  3. Мы не можем использовать трюк с нулевым прощением трюк (public string name { get; set; } = null!;), так как тогда мы не сможем убедиться, что свойство Name установлено, и мы можем получитьс null в свойстве Name, где этого не следует ожидать (внутри служб)

Любой другой вариант, который я забыл рассмотреть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...