Blazor - странное присваивание работает
Точнее не присваивание, а привязывание. Может, особенности Блейзора, а может и вообще... Вобщем, есть компонент со свойством
[Parameter]
public bool Value { get; set; }
Оказывается, я могу в разметке привязать его через рид-онли свойство
определение свойства (самое простое для краткости)
public bool MyValue => true;
привязка в компоненте
Value=@MyValue
а могу через метод
определение метода (самое простое для краткости)
public bool GetMyValue() => true;
привязка в компоненте
Value=@GetMyValue()
Можно ещё проще - сделать названия одинаковыми, чтобы было видно, что разница между этими работающими вариантами прямо минимальная:
public bool MyValue => true;
Value=@MyValue
public bool MyValue() => true;
Value=@MyValue()
Почему с методом работает? Ведь я привязываю свойство Value, и оно должно привязываться к свойству же, а не к методу?
пока в планах другое на выходные.
Катание на доске с парусом? ))
Позже подготовлю. Пока в мыслях лишь то, что рид-онли свойства и методы с лямбдами под капотом во что-то превращаются, что можно так привязывать. Опять сахар синтаксический, который все конвенции рушит. По сути, пофиг, что ты там в языке выучил - главное, что происходит при компиляции в промежуточный язык. Поэтому и всплывают все эти странные поведения.
Еще ничего не пробовал, только подумалось следующее
https://blazor-university.com/components/two-way-binding/
То есть получается всегда Value = x
Да я почитал там всё, и ещё статьи, на которые оно ссылается. Так и не понял. Понял только, что когда интерпретатор Блейзор код разметки разбирает, он там может что угодно наворотить. Поэтому там, где скармливается свойство, иногда можно скормить и метод. Типа он смотрит на список входящих параметров и возврат. И если для какой-то привязки не нужны входящие, а нужен лишь возврат, то ему что свойство, что метод - одно и то же. Как-то так.
Почему с методом работает?
Поставим вопрос по другому. А почему с методом /1way binding/ не должно работать?
В итоге то биндинг преобразовывается к следующему:
builder.AddAttribute(x, "Value", (object)(global::Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.TypeCheck<global::System.Boolean>(MyValue);