C# не видит перегрузку
Использую библиотеку Microsoft.Toolkit.Mvvm, во ViewModel наследуюсь от ObservableObject (в нем есть метод SetProperty. По какой-то непонятной мне причине в документации и действительности перегрузки метода несколько отличаются, однако даже с теми что есть - невозможно перегрузить. Сигнатура метода следующая:
protected bool SetProperty<T> (T oldValue, T newValue, Action<T> callback, string? propertyName = default);
Во ViewModel:
private bool _enableInbound;
public bool EnableInbound
{
get { return _enableInbound; }
set
{
SetProperty(ref _enableInbound, value, callback: new System.Action<bool>((target) =>
{
}));
}
}
Но, при попытке использовать её вылезает вот такое как на скрине. Пробовал в Action передавать метод, так же пытался использовать просто лямбду без new Action, результат одинаковый. В чем может быть проблема?
Текст ошибки: Error CS1615 Argument 1 may not be passed with the 'ref' keyword
Ответы (1 шт):
Есть же явная сигнатура, прямо в документации по вашей ссылке SetProperty<T>(T, T, Action<T>, String). Почему вы думаете, что это можно использовать как SetProperty<T>(ref T, T, Action<T>, String)? Разница между T и ref T есть!
Вот все перегрузки, которые я вижу в этой библиотеке
protected bool SetProperty<T>([NotNullIfNotNull("newValue")] ref T field, T newValue, [CallerMemberName] string? propertyName = null)
protected bool SetProperty<T>([NotNullIfNotNull("newValue")] ref T field, T newValue, IEqualityComparer<T> comparer, [CallerMemberName] string? propertyName = null)
protected bool SetProperty<T>(T oldValue, T newValue, Action<T> callback, [CallerMemberName] string? propertyName = null)
protected bool SetProperty<T>(T oldValue, T newValue, IEqualityComparer<T> comparer, Action<T> callback, [CallerMemberName] string? propertyName = null)
protected bool SetProperty<TModel, T>(T oldValue, T newValue, TModel model, Action<TModel, T> callback, [CallerMemberName] string? propertyName = null) where TModel : class
protected bool SetProperty<TModel, T>(T oldValue, T newValue, IEqualityComparer<T> comparer, TModel model, Action<TModel, T> callback, [CallerMemberName] string? propertyName = null) where TModel : class
Среди них нет ни одной, где одновременно можно передать ref и колбэк. И самое главное - зачем вам там колбэк?
private bool _enableInbound;
public bool EnableInbound
{
get => _enableInbound;
set
{
if (SetProperty(ref _enableInbound, value))
{
// вызвать колбэк или выполнить код можно прямо здесь
}
}
}
