Тип seq <'a> несовместим с типом Collections.Generic.IEnumerable <' a> - PullRequest
0 голосов
/ 11 октября 2018

При использовании следующего кода в файле fsx я получаю сообщение об ошибке The type seq<'a> is not compatible with the type Collections.Generic.IEnumerable<'a>.

module ReadOnly =
    let private asList<'a> (en:System.Collections.Generic.IEnumerable<'a>) : System.Collections.Generic.IList<'a> = 
        new System.Collections.Generic.List<'a>(en) :>  System.Collections.Generic.IList<'a>
    let private asReadOnly<'a> (en:System.Collections.Generic.IEnumerable<'a>) = 
        new System.Collections.ObjectModel.ReadOnlyCollection<'a>(asList(en))
    let ofSeq<'a> (ss: 'a seq) = asReadOnly<'a>(ss) // <-- ERROR IS HERE ON ARGUMENT 'ss'

При использовании того же кода в консольном приложении netcoreapp2.1 все в порядке.

My paket.dependencies содержит следующее:

source https://www.nuget.org/api/v2
nuget NETStandard.Library
nuget canopy

, и я загружаю следующее:

#r "packages/NETStandard.Library/build/netstandard2.0/ref/netstandard.dll"
#r "packages/Selenium.WebDriver/lib/netstandard2.0/WebDriver.dll"
#r "packages/canopy/lib/netstandard2.0/canopy.dll"

Примечание: я включил netstandard2.0, так как у меня были проблемы с неНахождение Object

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

У меня нет полного ответа, но это то, что я узнал.Напомним:

  1. с NETStandard.Library показывает ошибку seq<'a> is not compatible.
  2. без NETStandard.Library ошибка 'Object' is required показывает

Еще ввариант # 2, в моих тестах код фактически выполняется при вызове с помощью FSI.Это означает, что ошибка является конфликтом библиотеки в модуле Intellisense.

В моих тестах сценарий запускается также при использовании параметра --noframework и обращении к любому из этих двух:

  • packages/FSharp.Core/lib/net45/FSharp.Core.dll
  • packages/FSharp.Core/lib/netstandard1.6/FSharp.Core.dll

... хотя только с версией 4.3.4, но не с версией 4.5.0

РЕДАКТИРОВАТЬ

Возможным решением является добавление явной ссылки на локальный GAC netstandard.dll, например:

#r @"C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\netstandard\v4.0_2.0.0.0__cc7b13ffcd2ddd51\netstandard.dll"

Это, кажется, решает проблему для Intellisense

0 голосов
/ 12 октября 2018

Любая причина не использовать метод List<'T> AsReadOnly()?

let ofSeq<'a> (ss: 'a seq) = (ResizeArray ss).AsReadOnly()
// val ofSeq :
//   ss:seq<'a> -> System.Collections.ObjectModel.ReadOnlyCollection<'a>
...