Компилятор потерял тип?

Причем подсказка отображает тип:

введите сюда описание изображения

... но компиляция вызывает ошибку. И даже "!" не помогает.

введите сюда описание изображения

public struct SOptions<T> where T : notnull {
  public static SOptions<T> Default => new();
  public int SomeProperty = 123;
}

public class Options<T> where T : notnull {
  public int SomeProperty { get; private set; } = 0;

  public Options(SOptions<T> options) => SetOptions_1(options);

  public void SetOptions_1(SOptions<T>? options) {
    options ??= SOptions<T>.Default;
    // Строка ниже вызывает ошибку, код не компилируется
    // error CS1061
    SomeProperty = options!.SomeProperty;
  }

  // ... Такой вариант ошибок не вызывает.
  public void SetOptions_2() {
    var options = SOptions<T>.Default;
    SomeProperty = options.SomeProperty;
  }

  // ... С этим тоже работает.
  public void SetOptions_3(SOptions<T>? options) {
    options ??= SOptions<T>.Default;
    SomeProperty = ((SOptions<T>)options).SomeProperty;
  }
}

dotnetfiddle.net


Ответы (1 шт):

Автор решения: aepot

Используйте не nullable локальную переменную

public void SetOptions_1(SOptions<T>? options)
{
    SOptions<T> opt = options ?? SOptions<T>.Default;
    SomeProperty = opt.SomeProperty;
}

Или не используйте

public void SetOptions_1(SOptions<T>? options)
{
    if (options.HasValue)
    {
        SomeProperty = options.Value.SomeProperty;
    }
}
→ Ссылка