В C# этот синтаксис инициализации объекта отлично работает:
using System.Net;
var p = new WebProxy{Address = new Uri("http://127.0.0.1:1234")};
Насколько я понимаю, эквивалент такого синтаксиса в F# должен выглядеть следующим образом:
open System
open System.Net
let proxy = new WebProxy( Address = Uri("http://127.0.0.1:1234") )
Однако это не удается с:
error FS0041: A unique overload for method 'WebProxy'
could not be determined based on type information prior
to this program point. A type annotation may be needed.
Known type of argument: Address: Uri
Candidates:
- WebProxy() : WebProxy
- WebProxy(Address: Uri) : WebProxy
Вопросы:
Вы можете добавить аннотацию типа практически ко всему, включая конструктор: (WebProxy : unit -> WebProxy)()
. Это создаст новые WebProxy
Я думаю, что ошибка возникает только в случае, потому что у конструктора есть параметр Address
, а у типа также есть свойство Address
. В F# именованные параметры имеют тот же синтаксис, что и инициализация объекта, поэтому он не знает, какую функцию использовать.
Это необычное столкновение, потому что имена параметров обычно имеют CamelCase, а не PascalCase. Одним из простых исправлений в этом случае является использование безымянного параметра вместо инициализатора объекта:
let proxy = WebProxy(Uri("http://127.0.0.1:1234"))
Просто так получилось, что
WebProxy
имеет параметр в PascalCase, поэтому он конфликтует с именем свойства. Просто удалите частьAddress =
и все заработает