Чтобы добавить некоторые детали, компилятор F # использует другой подход для представления необязательных параметров, который (в настоящее время) не совместим с подходом C # 4.0. F # просто позволяет вам использовать более приятный синтаксис, когда параметр имеет тип option<'a>
(и помечен как необязательный). Вы можете использовать его как есть или использовать функцию defaultArg
для предоставления значения по умолчанию в вашем коде .
В C # параметр специально представлен в метаданных (особенность .NET 4.0), а значение по умолчанию указано в метаданных . К сожалению, в F # невозможно создать совместимый с C # 4.0 необязательный параметр.
Если вы хотите сделать код C # немного более приятным, вы можете определить статический служебный класс, который позволит вам использовать вывод типов при создании значений option<'a>
:
static class FSharpOption {
static FSharpOption<T> Some<T>(T value) {
return new FSharpOption<T>(value);
}
}
// Then you can write just:
var myObj1 = new Person(FSharpOption.Some("mark"));
Или вы можете изменить объявление F # для использования перегруженных методов / конструкторов, которые работают на обоих языках:
type Person(name) =
do printfn "%s" name
// Add overloaded constructor with default value of name'
new () = Person("")