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 шт):
Я использовал это:
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;
}
}
Обязательно присвойте значение параметрам 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;
}
}