2011-12-28 2 views
5

При разработке приложения F # у меня есть тип, который содержит свойство типа Lazy<'T>.Свойства F # по сравнению с свойствами C#

По-видимому, один интересный побочный эффект (простите за каламбур) путь, что F # обрабатывает синтаксический сахар свойств (в отличие от C# способа) является то, что геттер и сеттер свойства могут возвращать/принимать разные типы. (. По крайней мере, Visual Studio не жалуется, как я пишу код, который использует это наблюдение)

Например, это выгодно для меня, чтобы сделать это:

let lazyValue = lazy 0 

member this.Value 
    with get() = 
     lazyValue.Value 
    and set _lazyVal = 
     lazyValue <- _lazyVal 

... такие, что стоимость возвращение a int, но принимает только Lazy<int>.

Что мне интересно, так это теоретические, идиоматические и практические возражения против подобных действий. Это что-то такое, при котором снаряд Ф # будет поднимать нос? Есть ли какое-то функциональное программирование, что это (объектно-ориентированная реализация) явно нарушает? Является ли этот подход доказанным, чтобы вызвать проблемы в широкомасштабных приложениях? Если да, то почему/как?

+3

То, что это разрешено, является ошибкой в ​​компиляторе F # - спецификация F # говорит, что это незаконно. Ожидайте, что это больше не будет работать в будущих версиях F #. : -] – ildjarn

ответ

5

Возможно, это ошибка, которую «Visual Studio не жалуется, как [вы] пишете код, который использует это наблюдение». См Using F# Option Type in C#

комментария в ответ на вопрос, связанные заметки:

Из раздела 8.13.1 из спецификации: Если член свойства имеет как геттер и сеттер, и ни индексатор, то подписи как геттера, так и сеттера должны иметь один и тот же тип свойства

Смежные вопросы