gpt4 book ai didi

linux - Linux 中的 .NET Core SDK 2.2.108 是否不支持 F# 匿名记录?

转载 作者:行者123 更新时间:2023-12-01 19:44:58 27 4
gpt4 key购买 nike

我使用的是 linux (Manjaro) 和 .NET Core 2.2.108,似乎不支持 F# 匿名记录,但表明确实如此,例如 here

now available with .NET Core 2.2

我有以下 F# 虚拟项目:

ConsoleApp.fsproj:

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

<ItemGroup>
<Compile Include="Program.fs"/>
</ItemGroup>

</Project>

包含此文件:

Program.fs:

[<EntryPoint>]
let main argv =
let a = {| A = "Michelle" |}
0

dotnet信息:

$ dotnet --version
2.2.108

$ dotnet --list-runtimes
Microsoft.NETCore.App 2.2.6 [/opt/dotnet/shared/Microsoft.NETCore.App]

$ dotnet --list-sdks
2.2.108 [/opt/dotnet/sdk]

编译给了我:

$ dotnet build
Microsoft (R) Build Engine version 15.9.20.63311 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

Restoring packages for /home/perret/Desktop/ConsoleApp/ConsoleApp/ConsoleApp.fsproj...
Generating MSBuild file /home/perret/Desktop/ConsoleApp/ConsoleApp/obj/ConsoleApp.fsproj.nuget.g.props.
Restore completed in 172.04 ms for /home/perret/Desktop/ConsoleApp/ConsoleApp/ConsoleApp.fsproj.
/home/perret/Desktop/ConsoleApp/ConsoleApp/Program.fs(3,14): error FS0010: Unexpected symbol '|' in expression [/home/perret/Desktop/ConsoleApp/ConsoleApp/ConsoleApp.fsproj]
/home/perret/Desktop/ConsoleApp/ConsoleApp/Program.fs(3,13): error FS0604: Unmatched '{' [/home/perret/Desktop/ConsoleApp/ConsoleApp/ConsoleApp.fsproj]

Build FAILED.

/home/perret/Desktop/ConsoleApp/ConsoleApp/Program.fs(3,14): error FS0010: Unexpected symbol '|' in expression [/home/perret/Desktop/ConsoleApp/ConsoleApp/ConsoleApp.fsproj]
/home/perret/Desktop/ConsoleApp/ConsoleApp/Program.fs(3,13): error FS0604: Unmatched '{' [/home/perret/Desktop/ConsoleApp/ConsoleApp/ConsoleApp.fsproj]
0 Warning(s)
2 Error(s)

正常吗?

[编辑]

我以为 Rider 确实将 FSharp.Core4.5.2 更新到 4.7.0 但事实上并非如此:

$ sudo dotnet add ConsoleApp.fsproj package FSharp.Core -v 4.7.0
Writing /tmp/tmpBQmP0N.tmp
info : Adding PackageReference for package 'FSharp.Core' into project 'ConsoleApp.fsproj'.
log : Restoring packages for /home/perret/Desktop/ConsoleApp/ConsoleApp/ConsoleApp.fsproj...
info : Package 'FSharp.Core' is compatible with all the specified frameworks in project 'ConsoleApp.fsproj'.
error: Error while performing Update for package 'FSharp.Core'. Cannot edit items in imported files -
error: Item 'PackageReference' for 'FSharp.Core' in Imported file '/opt/dotnet/sdk/2.2.108/FSharp/Microsoft.FSharp.NetSdk.props'.

最佳答案

主要问题:.NET Core SDK 版本

@EhouarnPerret if I test it with dotnet sdk version 2.2.2xx, 2.2.3xx, 2.2.4xx, it works fine for me. If I change the sdk to 2.2.1xx, I get the same error as yrs.

部分是关键。

我基本上必须设置 AUR 中可用的最后一个版本:

aspnet-runtime-preview 3.0.0+100+preview.013656-2
dotnet-host-preview 3.0.0+100+preview.013656-2
dotnet-runtime-preview 3.0.0+100+preview.013656-2
dotnet-sdk-preview 3.0.0+100+preview.013656-2

否则我就只能使用社区包中提供的版本:

aspnet-runtime 2.2.6+108-1
dotnet-host 2.2.6+108-1
dotnet-runtime 2.2.6+108-1
dotnet-sdk 2.2.6+108-1

这两者之间没有任何可用的东西。

我还想指出的是,软件包的版本与 SDK 的版本不匹配:

套餐dotnet-sdk 2.2.6+108-1 => 实际 .NET Core SDK 版本 2.2.108 [/opt/dotnet/sdk]

<小时/>

关于如何更新 FSharp.Core版本?

顺便说一句,我在更新 FSharp.Core 时遇到了问题正确版本的包来自于: https://github.com/dotnet/fsharp/issues/3656

基本上是fsproj需要看:

<FSharpCoreImplicitPackageVersion>4.7.0</FSharpCoreImplicitPackageVersion><PropertyGroup> 。(无论您想要什么版本)

更新 FSharp.Core与 nuget 明确不起作用。

[编辑]

事实上确实如此,只是需要一点小东西,参见 here

<PackageReference Update="FSharp.Core" Version="4.7.0"/> is what you need to add in *.fsproj, otherwise the build will be confused about which FSharp.Core to reference. This is by design w.r.t how the SDK works.

基本上,如果您使用 udpate像这样的属性 <PackageReference Update="FSharp.Core" Version="4.7.0"/><ItemGroup>它也正在工作。

我相信,这实际上比以前的方法更干净和标准。

如果您没有执行上述任何一项操作,则将使用的版本是默认情况下随 .NET Core SDK 版本“分配”的版本。

| Arch Package                 | Actual SDK Version           | Default `FSharp.Core` version |
| -----------------------------| ---------------------------- | ----------------------------- |
| `2.2.6+108-1` | `2.2.108` | `4.5.2` |
| `3.0.0+100+preview.013656-2` | `3.0.100-preview8-013656` | `4.6.2` |

即使有 package dotnet-sdk 2.2.6+108-1版本为4.7.0正确设置 FSharp.Core匿名记录不会编译,因为它们是 4.6 的一部分该特定软件包版本中的 SDK 版本不包含的语言版本。

<小时/>

引用的版本是否是 FSharp.Core真的很重要吗?

总之,我只需要拥有更新版本的 .NET Core,即 FSharp.Core 版本。真的没关系。事实上:

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<Compile Include="Program.fs" />
</ItemGroup>

<ItemGroup>
<PackageReference Update="FSharp.Core" Version="4.5.0"/>
</ItemGroup>

</Project>

和一个Program.fs如下所示:

[<EntryPoint>]
let main argv =
let a = {| Diameter = 10; Area = 10; Circumference = 10 |}
0

仍然编译,同时引用版本4.5.0FSharp.Core .

考虑到匿名记录所需的 F# 版本是 4.6.0,这似乎有点奇怪。 : https://github.com/fsharp/fslang-design/blob/master/FSharp-4.6/FS-1030-anonymous-records.md

现在是F#语言版本和FSharp.Core与同一件事有关?事实并非如此。

关于linux - Linux 中的 .NET Core SDK 2.2.108 是否不支持 F# 匿名记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57701519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com