Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#8支持.NET框架吗?_C#_.net_Visual Studio_.net Standard_C# 8.0 - Fatal编程技术网

C#8支持.NET框架吗?

C#8支持.NET框架吗?,c#,.net,visual-studio,.net-standard,c#-8.0,C#,.net,Visual Studio,.net Standard,C# 8.0,在Visual Studio 2019高级生成设置中,C#8似乎不适用于.NET Framework项目,仅适用于.NET Core 3.0项目(如下图所示): C#8是否支持.NET框架?根据语言,C#8确实与框架相关联: 这意味着使用这些功能所需的类型在.NET Framework 4.8上不可用。同样,默认接口成员实现依赖于新的运行时增强功能,我们也不会在.NET运行时4.8中实现这些功能 因此,只有在实现.NET标准2.1的平台上才支持使用C#8.0。十多年来,为了保持运行时的稳定性,

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

C#8是否支持.NET框架?

根据语言,C#8确实与框架相关联:

这意味着使用这些功能所需的类型在.NET Framework 4.8上不可用。同样,默认接口成员实现依赖于新的运行时增强功能,我们也不会在.NET运行时4.8中实现这些功能

因此,只有在实现.NET标准2.1的平台上才支持使用C#8.0。十多年来,为了保持运行时的稳定性,我们一直无法在其中实现新的语言特性。有了现代运行时的并行性和开源性,我们觉得我们可以负责任地再次对它们进行改进,并在进行语言设计时牢记这一点。Scott在其对.NET Core 3.0和.NET Framework 4.8的更新中解释说,.NET Framework在未来将看到更少的创新,而不是专注于稳定性和可靠性。有鉴于此,我们认为它错过一些语言特性比没有人获得它们要好

是的,C#8可以与Visual Studio 2019中的.NET Framework和其他早于.NET Core 3.0/.NET Standard 2.1的目标(或Visual Studio的旧版本,如果需要)一起使用

只需在csproj文件中将语言版本设置为
8.0
。您还可以在中执行此操作,以将其应用于解决方案中的所有项目。请阅读下面的内容,了解如何在Visual Studio 2019(版本16.3及更高版本)中执行此操作

大多数(但不是所有)功能都可以在任何框架中使用


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

  • 也支持,但设计更复杂的可空用例所需的新功能不受支持。我将在“血淋淋的细节”一节中更详细地介绍这一点
可使其工作的功能 这些需要不在.NET Framework中的新类型。它们只能与“polyfill”NuGet软件包或代码文件一起使用:

  • -
默认接口成员-不工作、不能工作和永远不会工作 不会在.NET Framework下编译,也不会工作,因为它们需要在CLR中进行运行时更改。NET CLR现在被冻结,因为.NET核心现在是前进的方向

有关什么起作用、什么不起作用以及可能的多边形填充的更多信息,请参阅Stuart Lang的文章


代码 下面的C#项目以.NET Framework 4.8为目标,使用C#8可空引用类型,在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>
然后,我尝试了一个.NET Framework 4.5.2 WinForms项目,使用传统的
.csproj
格式,并添加了相同的可空引用类型属性。我将Visual Studio高级生成设置对话框(在16.3中禁用)中的语言类型更改为
latest
,并保存了项目。当然,由于这一点,它没有建立。我在文本编辑器中打开了项目文件,并在构建配置
PropertyGroup
中将
latest
更改为
preview

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
   <LangVersion>preview</LangVersion>
<PropertyGroup>
   <Nullable>enable</Nullable>
我重新加载了该项目,并构建了它


Visual Studio 2019 Visual Studio 2019版本16.3的RTM版本发生了重大变化,C#8.0的发布版本:语言选择下拉菜单已被禁用:

微软对此的建议是:

向前看。。。每个框架的每个版本都有一个 支持和默认版本,我们不支持任意 版本。为了反映支持方面的这一变化,请永久提交 禁用“语言版本”组合框并添加指向文档的链接 解释变化

打开的文档是。这只列出了C#8.0作为.NETCore3.x的默认语言。它还确认,每个框架的每个版本都将有一个单独的支持和默认版本,并且不再依赖该语言的框架不可知论

通过编辑.csproj文件,.NET Framework项目的语言版本仍然可以强制为8


血淋淋的细节 当这个答案第一次被写出来时,C#8处于预览阶段,涉及到大量的侦探工作。我把这些信息留给子孙后代。如果您不需要知道所有血淋淋的细节,可以跳过它。

C#语言在历史上一直是——也就是说,能够编译框架的旧版本——尽管有些功能需要新类型或CLR支持

大多数C#爱好者都会阅读Mads Torgersen的博客文章,其中解释了C#8的某些功能具有平台依赖性:

异步流、索引器和范围都依赖于新的框架类型 这将是.NET标准2.1的一部分。NET Core 3.0以及 Xamarin、Unity和Mono都将实现.NET标准2.1,但.NET 框架4.8将不再适用。这意味着需要使用的类型 这些功能在.NET Framework 4.8上不可用

这看起来有点像是在C#7中引入的。这项功能需要新的类型,即
ValueTuple
结构,这些类型在4.7以下的NET Framework版本或2.0以上的.NET标准版本中不可用但是,C#7仍然可以在较旧版本的.NET中使用,既可以不使用值元组,也可以安装值元组。VisualStudio明白这一点,世界上一切都很好

然而,Mads也写道:

因此,只有t平台才支持使用C#8.0
<PropertyGroup>
   <Nullable>enable</Nullable>