类型 seq<'a> 与类型 Collections.Generic.IEnumerable<'a> 不兼容
The type seq<'a> is not compatible with the type Collections.Generic.IEnumerable<'a>
在 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"
Note: I included netstandard2.0 as I was having issues with not finding Object
有什么理由不使用 List<'T>
的方法 AsReadOnly()
?
let ofSeq<'a> (ss: 'a seq) = (ResizeArray ss).AsReadOnly()
// val ofSeq :
// ss:seq<'a> -> System.Collections.ObjectModel.ReadOnlyCollection<'a>
我没有完整的答案,但这是我发现的。
回顾一下:
- 显示
NETStandard.Library
错误 seq<'a> is not compatible
。
- 没有
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 的问题
在 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"
Note: I included netstandard2.0 as I was having issues with not finding
Object
有什么理由不使用 List<'T>
的方法 AsReadOnly()
?
let ofSeq<'a> (ss: 'a seq) = (ResizeArray ss).AsReadOnly()
// val ofSeq :
// ss:seq<'a> -> System.Collections.ObjectModel.ReadOnlyCollection<'a>
我没有完整的答案,但这是我发现的。 回顾一下:
- 显示
NETStandard.Library
错误seq<'a> is not compatible
。 - 没有
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 的问题