GetType не работает с out параметром

Я написал этот код и он не работает. Я понимаю, почему, но как мне его исправить?

internal class ViewProperty<T> : IViewProperty<T>
{
  protected Dictionary<Type, object> PropetriesStorage { get; } = new();

  public bool TryGetProperty<PropType, SubType>(out PropType _property) where PropType : IViewProperty<SubType>
  {
    bool result = PropetriesStorage.TryGetValue(_property.GetType(), out var temp);
    Trace.Assert(temp is PropType);
    _property = (PropType)temp;
    return result;
  }
}

Возникает ошибка "CS0269 Использование выходного параметра "_property", которому не присвоено значение."
Разве параметр (пусть даже не инициализированный) не содержит тип в момент вызова?


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

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

Я использовал это:

public bool TryGetProperty<SubType>([NotNullWhen(true)] out IViewProperty<PropType>? _property)
{
  if (PropetriesStorage.TryGetValue(typeof(PropType), out var temp))
  {
    _property = (PropType)temp;
    return true;
  }
  else
  {
    _property = default;
    return false;
  }
}
→ Ссылка
Автор решения: Dev18

Обязательно присвойте значение параметрам outв вызываемом методе перед доступом к значению ошибка CS0269

Вы пытаетесь получить тип _property с помощью метода .GetType(). Но ведь на момент вызова этого метода переменная _property еще не инициализирована

Предложу использование typeof(PropType)

typeof(PropType) возвращает объект типа Type, представляющий тип PropType, который является обобщенным параметром метода, работает корректно, так как PropType уже определён на этапе компиляции и не зависит от значения переменной

Мое исправление заключается в замене обращения к GetType() неинициализированной переменной на безопасное обращение к типу через typeof(PropType), что устранило проблему компиляции и сохранило логику работы метода

class ViewProperty<T> : IViewProperty<T>
{
    protected Dictionary<Type, object> PropetriesStorage { get; } = new();

    public bool TryGetProperty<PropType, SubType>(out PropType _property) where PropType : IViewProperty<SubType>
    {
        bool result = PropetriesStorage.TryGetValue(typeof(PropType), out var temp);
        if (temp is PropType prop)
        {
            _property = prop;
            return result;
        }

        _property = default;
        return false;
    }

    public void AddProperty<PropType>(PropType property) where PropType : class
    {
        PropetriesStorage[typeof(PropType)] = property;
    }
}
→ Ссылка