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 шт):

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

Есть же явная сигнатура, прямо в документации по вашей ссылке 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))
        {
            // вызвать колбэк или выполнить код можно прямо здесь
        }
    }
}
→ Ссылка