gpt4 book ai didi

c# - C# 8 是否支持 .NET Framework?

转载 作者:行者123 更新时间:2023-12-02 07:58:39 28 4
gpt4 key购买 nike

在 Visual Studio 2019 高级build设置中,C# 8 似乎不适用于 .NET Framework 项目,仅适用于 .NET Core 3.0 项目(如下图所示):

enter image description here

C# 8 是否支持 .NET Framework?

最佳答案

是的,C# 8 可以与 .NET Framework 一起使用 和 Visual Studio 2019 中比 .NET Core 3.0/.NET Standard 2.1 更早的其他目标(或旧版本的 Visual Studio,如果您 install a NuGet package)。
唯一需要的是将语言版本设置为 8.0在 csproj 文件中。您也可以在 Directory.Build.props 中执行此操作将其应用于解决方案中的所有项目。阅读下文,了解如何在 Visual Studio 2019 版本 16.3 及更高版本中执行此操作。
大多数(但不是全部)功能都可用,无论针对哪个框架。

有效的功能
以下功能仅是语法更改;无论框架如何,它们都可以工作:

  • Static local functions
  • Using declarations
  • Null-coalescing assignment
  • Readonly members
  • Disposable ref structs
  • Positional patterns
  • Tuple patterns
  • Switch expressions
  • Nullable reference types也支持,但新的 nullable attributes设计更复杂的可为空用例所需的不是。我在“血腥细节”部分更详细地介绍了这一点。

  • 可以使用的功能
    这些需要 .NET Framework 中没有的新类型。它们只能与“polyfill”NuGet 包或代码文件结合使用:
  • Asynchronous streams - Microsoft.Bcl.AsyncInterfaces
  • Indices and ranges

  • 默认接口(interface)成员 - 不,不能,永远不会工作
    Default interface members不会在 .NET Framework 下编译并且永远不会工作,因为它们需要在 CLR 中进行运行时更改。 .NET CLR 现在被卡住,因为 .NET Core 现在是前进的方向。
    有关哪些有效哪些无效以及可能的 polyfill 的更多信息,请参阅 Stuart Lang 的文章 C# 8.0 and .NET Standard 2.0 - Doing Unsupported Things .

    代码
    以下面向 .NET Framework 4.8 并使用 C# 8 可为空引用类型的 C# 项目在 Visual Studio 16.2.0 中编译。我通过选择 .NET 标准类库模板创建它,然后将其编辑为面向 .NET Framework:
    .csproj:
    <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
    <TargetFrameworks>net48</TargetFrameworks>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
    </PropertyGroup>
    </Project>
    。CS:
    namespace ClassLibrary1
    {
    public class Class1
    {
    public string? NullableString { get; set; }
    }
    }
    然后我尝试了一个 .NET Framework 4.5.2 WinForms 项目,使用旧版 .csproj格式,并添加了相同的可为空引用类型属性。我将 Visual Studio 高级build设置对话框中的语言类型(在 16.3 中禁用)更改为 latest并保存了项目。当然,就这一点而言,它没有建立。我在文本编辑器中打开了项目文件并更改了 latestpreview在构建配置中 PropertyGroup :
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <LangVersion>preview</LangVersion>
    然后,我通过添加 <Nullable>enable</Nullable> 启用了对可为空引用类型的支持。到主 PropertyGroup :
    <PropertyGroup>
    <Nullable>enable</Nullable>
    我重新加载了该项目,它构建了。

    视觉工作室 2019
    Visual Studio 2019 版本 16.3 的 RTM 版本发生了重大变化,C# 8.0 的启动版本:语言选择下拉列表已禁用:
    enter image description here
    微软 rationale因为这是:

    Moving forward, ... each version of each framework will have a singlesupported and default version, and we won't support arbitraryversions. To reflect this change in support, this commit permanentlydisables the language version combo box and adds a link to a documentexplaining the change.


    打开的文档是 C# language versioning .这仅将 C# 8.0 列为 .NET Core 3.x 的默认语言。它还证实了 今后,每个框架的每个版本都将有一个受支持的默认版本 并且不能再依赖语言的框架不可知论。
    通过编辑 .csproj 文件,仍然可以将 .NET Framework 项目的语言版本强制为 8。

    血腥的细节
    首次编写此答案时,C# 8 处于预览阶段,并且涉及大量侦探工作。我把这些信息留在这里供后代使用。如果您不需要了解所有血腥细节,请随意跳过它。
    C# 语言在历史上一直是 mostly framework neutral - 即能够编译旧版本的框架 - 尽管某些功能需要新类型或 CLR 支持。
    大多数 C# 爱好者都会阅读博客条目 Building C# 8.0作者 Mads Torgersen,其中解释了 C# 8 的某些功能具有平台依赖性:

    Async streams, indexers and ranges all rely on new framework typesthat will be part of .NET Standard 2.1... .NET Core 3.0 as well asXamarin, Unity and Mono will all implement .NET Standard 2.1, but .NETFramework 4.8 will not. This means that the types required to usethese features won’t be available on .NET Framework 4.8.


    这看起来有点像 Value Tuples这是在 C# 7 中引入的。该特性需要新类型 - ValueTuple结构 - 在低于 4.7 的 NET Framework 版本或低于 2.0 的 .NET Standard 中不可用。 然而 ,C# 7 仍然可以在旧版本的 .NET 中使用,无论是没有值元组还是通过安装 System.ValueTuple Nuget package . Visual Studio 理解这一点,并且一切都很好。
    但是,Mads 还写道:

    For this reason, using C# 8.0 is only supported on platforms that implement .NET Standard 2.1.


    ...如果这是真的,将排除在任何版本的 .NET Framework 中使用 C# 8,甚至在 .NET Standard 2.0 库中,直到最近我们才被鼓励将其用作库代码的基线目标。您甚至无法将它与 3.0 之前的 .NET Core 版本一起使用,因为它们也只支持 .NET Standard 2.0。
    调查开始了! ——
  • Jon Skeet 有一个使用 C# 8 的 Noda-Time alpha 版本 ready to go仅针对 .NET Standard 2.0。他显然希望 C# 8/.NET Standard 2.0 能够支持 .NET 系列中的所有框架。 (另请参阅 Jon 的博客文章 "First steps with nullable reference types")。
  • Microsoft 员工一直在讨论 C# 8 可为空引用类型的 Visual Studio UI on GitHub ,并且据说他们打算支持遗留 csproj (.NET Core SDK 格式之前的 csproj )。这是一个非常有力的迹象,表明 C# 8 将可用于 .NET Framework。 [我怀疑既然 Visual Studio 2019 语言版本下拉菜单已被禁用并且 .NET 已与 C# 7.3 绑定(bind),我怀疑他们会对此进行回溯]
  • 在著名的博文发表后不久,一条 GitHub thread讨论了跨平台支持。出现的一个重点是.NET Standard 2.1 will include a marker that denotes that default implementations of interfaces is supported - 该功能需要对 .NET Framework 永远不可用的 CLR 更改。以下是 Microsoft .NET 团队项目经理 Immo Landwerth 的重要内容:

  • Compilers (such as C#) are expected to use the presence of this field to decide whether or not to allow default interface implementations. If the field is present, the runtime is expected to be able to load & execute the resulting code.


  • 这一切都表明“C# 8.0 仅在实现 .NET Standard 2.1 的平台上受支持”过于简单,而且 C# 8 将支持 .NET Framework,但由于存在太多不确定性,我 asked on GitHub HaloFour 回答:

  • IIRC, the only feature that definitely won't appear on .NET Framework is DIM (default interface methods) as that requires runtime changes. The other features are driven by the shape of classes that might never be added to the .NET Framework but can be polyfilled through your own code or NuGet (ranges, indexes, async iterators, async disposal).


  • Victor Derks评论说“设计更复杂的可为空用例所需的 new nullable attributes 仅在随 .NET Core 3.0 和 .NET Standard 2.1 一起提供的 System.Runtime.dll 中可用...... [并且] 与 .NET Framework 4.8 不兼容”
  • 然而,伊莫·兰德沃斯 commented文章 Try out Nullable Reference Types 下的“我们的绝大多数 API 不需要任何自定义属性,因为类型是完全通用的或非空的”
  • Ben Hall提出问题 Availability of nullable attributes outside of Core 3.0在 GitHub 上,微软员工的以下评论值得注意:

  • C# 8 will be fully supported on .net core 3.0 and .net standard 2.1 only.If you manually edit the project file to use C# 8 with .net core 2.1,you are in unsupported territory. Some C# 8 features will happen towork well, some C# 8 features will work not too well (e.g. poorperformance), some C# 8 features will work with extra hacks, and someC# 8 features will not work at all. Very complex to explain. We do notactively block it so the expert users who can navigate through it cando so. I would not recommend this unsupported mix&match to be usedbroadly.


    (扬·科塔斯)

    People like you who are willing understand -- and work around them --are free to use C# 8. The point is, not all language features will workon down-level targets.


    (伊莫·兰德沃斯)

    买者自负
    Microsoft 不正式支持 C# 8/.NET Framework 组合。他们说,这仅供专家使用。

    关于c# - C# 8 是否支持 .NET Framework?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56651472/

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