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

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

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

C#8是否支持.NET Framework?

参考方案

是的,C#8可以与.NET Framework和Visual Studio 2019中的.NET Core 3.0 / .NET Standard 2.1之前的其他目标一起使用(如果您使用install a Nuget package,则可以使用Visual Studio的旧版本)。

必须将csproj文件中的语言版本设置为8.0

无论针对哪个框架,大多数(但不是全部)功能都可用。

起作用的功能

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

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
Indices and ranges

默认界面成员-不起作用

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; }
    }
}

然后,我尝试使用旧版.csproj格式的.NET Framework 4.5.2 WinForms项目,并添加了相同的可为空的引用类型属性。我在“ Visual Studio高级构建设置”对话框(在16.3中禁用)中将语言类型更改为latest,并保存了项目。当然,这一点不会建立。我在文本编辑器中打开了项目文件,并在构建配置latest中将preview更改为PropertyGroup

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
   <LangVersion>preview</LangVersion>

然后,通过在主<Nullable>enable</Nullable>中添加PropertyGroup来启用对可为空的引用类型的支持:

<PropertyGroup>
   <Nullable>enable</Nullable>

我重新加载了该项目,并进行了构建。

血腥细节

首次编写此答案时,C#8处于预览阶段,涉及许多侦探工作。我将这些信息留在这里供后人参考。如果您不需要了解所有血腥细节,请随时跳过它。

C#语言历来是mostly framework neutral-即能够编译框架的旧版本-尽管某些功能需要新的类型或CLR支持。

大多数C#爱好者将阅读Mads Torgersen的博客条目Building C# 8.0,该博客条目解释了C#8的某些功能具有平台依赖性:

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

看起来有点像C#7中引入的Value Tuples。该功能需要新的类型-ValueTuple结构-低于4.7的NET Framework版本或早于2.0的.NET Standard不可用。但是,C#7仍然可以在.NET的旧版本中使用,既可以不使用值元组,也可以通过安装System.ValueTuple Nuget package与它们一起使用。 Visual Studio理解了这一点,并且一切都很好。

但是,Mads也写道:

因此,仅在实现.NET Standard 2.1的平台上支持使用C#8.0。

...如果为真,则将排除在任何版本的.NET Framework中使用C#8,甚至在.NET Standard 2.0库中(实际上直到最近才鼓励我们将其用作库代码的基准目标)的可能性。您甚至无法在3.0之前的.NET Core版本中使用它,因为它们也仅支持.NET Standard 2.0。

调查正在进行中! --

乔恩·斯基特(Jon Skeet)使用C#8 ready to go发行了Alda-Time的Alpha版本,该版本仅针对.NET Standard 2.0。他显然希望C#8 / .NET Standard 2.0支持.NET系列中的所有框架。 (另请参阅乔恩的博客文章"First steps with nullable reference types")。
Microsoft员工一直在讨论Visual Studio UI for C#8可为空的引用类型on GitHub,并且据说他们打算支持旧版csproj(。NET Core SDK以前的格式csproj)。这非常有力地表明C#8将可与.NET Framework一起使用。 [我怀疑由于Visual Studio 2019语言版本下拉列表已被禁用并且.NET已与C#7.3绑定,因此他们现在将对此进行回溯]
著名博客文章发表后不久,GitHub thread讨论了跨平台支持。出现的重要一点是.NET Standard 2.1 will include a marker that denotes that default implementations of interfaces is supported-该功能需要CLR更改,而.NET Framework永远无法使用。这是Microsoft .NET团队程序经理Immo Landwerth的重要内容:

期望编译器(例如C#)使用此字段的存在来决定是否允许默认接口实现。如果存在该字段,则预期运行时能够加载和执行结果代码。

所有这些都指出“ C#8.0仅在实现.NET Standard 2.1的平台上受支持”,这过于简单了,而C#8将支持.NET Framework,但是由于不确定性很大,我asked on GitHub和HaloFour回答:

IIRC,.NET Framework上绝对不会出现的唯一功能是DIM(默认接口方法),因为它需要更改运行时。其他功能由可能从未添加到.NET Framework的类的形状驱动,但可以通过您自己的代码或NuGet(范围,索引,异步迭代器,异步处理)进行多填充。

Victor Derks评论说“设计更复杂的可空使用案例所需的new nullable attributes仅在.NET Core 3.0和.NET Standard 2.1附带的System.Runtime.dll中可用... [并且]与.NET不兼容框架4.8“
但是,Immo Landwerth commented在文章Try out Nullable Reference Types下的“绝大多数API不需要任何自定义属性,因为类型是完全通用的或非空的”
Ben Hall在GitHub上引发了Availability of nullable attributes outside of Core 3.0问题,值得注意的是Microsoft员工的以下评论:

仅在.net core 3.0和.net standard 2.1上完全支持C#8。
如果您手动编辑项目文件以将C#8与.net core 2.1一起使用,
您在不受支持的地区。一些C#8功能将会发生
可以很好地工作,某些C#8功能将不能很好地工作(例如,性能较差)
性能),某些C#8功能将与额外的技巧配合使用,而某些功能
C#8功能根本无法使用。解释很复杂。我们不
主动阻止它,以便可以浏览它的专家用户可以
这样做。我不建议您使用这种不受支持的混合搭配
宽广地。

(Jan Kotas)

像您一样愿意理解并在他们周围工作的人-
可以免费使用C#8。要点是,并非所有语言功能都可以使用
在下层目标上

(Immo Landwerth)

Visual Studio 2019

Visual Studio 2019版本16.3的RTM版本已发生重大变化-C#8.0的启动版本:语言选择下拉列表已被禁用:

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

Microsoft的rationale为此:

展望未来,每个框架的每个版本都会有一个
支持的默认版本,我们将不支持任意版本
版本。为了反映这种支持上的变化,此承诺将永久
禁用语言版本组合框并向文档添加链接
解释变化。

打开的文档为C# language versioning。这列出了C#8.0作为.NET Core 3.x的默认语言。它还确认了每个框架的每个版本都将具有单个受支持的默认版本,并且不再依赖于该语言的框架不可知论。

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

买者自负

Microsoft尚未正式支持C#8 / .NET Framework组合。他们说,这仅适用于专家。

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

从ASP.NET 1.1转换为ASP.Net 3.5后,单选按钮停止工作 - javascript

[我在下面以FYI的形式发布我们的问题和解决方案。如果您有Microsoft或代表机构对此问题的正式声明,我会将其标记为答案。否则,我下面的帖子将作为答案]。问题:我们采用了ASP.Net 1.1程序,并将其转换为ASP.Net 3.5。该页面最初正确显示,默认情况下选中一个单选按钮,并显示一个项目列表(“列表A”)。当我们单击另一个单选按钮时,它将正确显示…

.NET Core解决方案中同时具有API和MVC项目的约定 - c#

我有一个由以下项目构成的ASP.NET Core(.NET Core 2.2)应用程序:API:表示WebAPI(控制器继承ControllerBase)服务:包含API控制器用来访问数据库等的服务数据库:它包含常用的数据库存储库,服务层可利用这些数据库访问数据库现在,我想添加一个与API对话的UI(MVC部分位于.NET核心之前)。 .NET Core如何…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

在ASP.NET MVC中创建数据库回调的最有效方法 - c#

我有一个ASP.NET MVC网页,该网页基本上通过日期过滤器显示MS SQL数据库中表的行。当新行插入数据库表时,我想用新行列表更新网页视图。实现此目标的最有效方法是什么?基本上,我想从我的JavaScript创建一个到数据库服务器的回调,以用新结果更新UI。假设数据库表中的行数很大。(〜1百万)谢谢,cas 参考方案 如果数据库更新非常频繁,则可以按特定…