Мне кажется, что некоторые свойства типа опции F # не видны из проектов C#. Проверяя типы, я вижу более или менее причину, но я не совсем понимаю, что именно происходит, почему эти выборы были сделаны или как лучше всего обойти проблему.Почему некоторые свойства (например, IsSome и IsNone) для FSharpOption не видны с C#?
Ниже приведены некоторые фрагменты, демонстрирующие проблему. У меня есть решение VS2015, содержащее два проекта, проект C# и проект F #. В # проекта F, у меня есть класс, определяемый следующим образом:
type Foo() =
member this.Bar() = Some(1)
Кроме того, в F # Я могу написать что-то вроде этого:
let option = (new Foo()).Bar()
let result = if option.IsNone then "Is none" else "Is some"
Так может показаться, что тип параметра имеет свойство с именем IsNone
. Теперь, в проекте C#, у меня есть ссылка на .dll, скомпилированный из проекта F #. Это позволяет мне писать, например.
var optionType = new Foo().Bar();
Переменная optionType
является FSharpOption<int>
. Как я уже отмечал выше, когда я использую типы опций в проектах F #, я обычно имею доступ, например, к объектам IsSome
и IsNone
. Однако, когда я пытаюсь написать что-то вроде optionType.IsNone
, я получаю ошибку CS1546 «Свойство, индекс или событие ... не поддерживается языком». В согласовании с этим, Intellisense не обнаруживает свойство:
Теперь при проверке типа FSharpOption, я могу видеть, что IsNone и IsSome «Свойства» отображаются как статические методы:
с другой стороны, когда я проверить тип из F #, я вижу следующие вместо:
Здесь «существование» свойств IsSome
и IsNone
очевидно. Наводя курсор на эти свойства, VS2015 дает мне следующее примечание: «Содержащий тип может использовать« null »в качестве значения представления для своего случая с унифицированным объединением. Этот член будет скомпилирован как статический член». Именно по этой причине свойства недоступны, кроме как статические методы (как отмечают Лукев и Федор Сойкин).
Итак, ситуация выглядит так: Скомпилированный тип FSharpOption не имеет никаких свойств IsNone и IsSome. Что-то происходит за кулисами в F #, чтобы включить эмуляцию этих свойств.
Я знаю, что могу обойти это, используя OptionModule
в Microsoft.FSharp.Core. Однако, похоже, что эта функциональность является сознательным выбором для архитекторов основной библиотеки F #. Каковы причины выбора? И использует OptionModule
правильное решение, или есть лучший способ использовать тип FSharpOption<T>
от C#?
Спасибо, факт, что значения None действительно null, является хорошим объяснением того, почему свойства IsNone и IsSome удалены. Я немного отредактировал вопрос, чтобы включить ваше и замечание Lukegv о том, что в скомпилированном классе «свойства» являются статическими. –
Sooo ... Вы все еще не получаете механику и причины? Что-нибудь еще неясно? –
Нет, это имеет смысл, спасибо :-) –