Предлагаю расширить их синтаксис ключевыми словами getting setting setted(?) и дать доступ в них ко внутреннему полю
Будут доступны следующие паттерны
// lazy value (да, я в курсе, что есть обертки для этого)
public Value : string { getting {when (autofield == null) autofield = someLong} }
// notify
public Value : string
{
get;
setting { when (autofield != value) fireValueChanging() }
setted { when (autofield != oldvalue) fireValueChanged() }
}
// constraint
public Value : string
{
get;
setting
{
match (value)
{
| "One" | "Two" => ()
| _ => throw ArgumentException();
}
}
}
Чем не устраивает замена автосвойства на обычное: приходится открывать классу внутреннее поле, которое по ошибке может быть изменено в обход свойства.
Можно решить и макрами, но я не знаю как в них добраться до внутреннего поля и синтаксис получается не эстетичный.