类型seq <'a>与类型Collections.Generic.IEnumerable <'a>不兼容

时间:2018-10-11 04:02:18

标签: f# .net-core f#-interactive

在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控制台应用程序中使用相同的代码时,一切都很好。

我的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"
  

注意:由于没有找到Object

的问题,我包括了netstandard2.0

2 个答案:

答案 0 :(得分:1)

是否有理由不使用List<'T>的方法AsReadOnly()

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

答案 1 :(得分:1)

我没有完整的答案,但这是我发现的。 回顾一下:

  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的问题