<LangVersion>latest</LangVersion>是否安全?

3
我们有一个 .NET Framework 4.x 项目,语言版本设置如下:
<LangVersion>latest</LangVersion>

根据文档,最新的C#编译器根据项目的目标框架或多个框架确定默认语言版本。Visual Studio没有提供更改该值的用户界面,但您可以通过编辑csproj文件来更改它。默认选择确保您使用与目标框架兼容的最新语言版本。您将受益于访问与项目目标兼容的最新语言功能。此默认选择还确保您不使用需要类型或运行时行为在目标框架中不可用的语言。选择比默认版本更新的语言版本可能会导致难以诊断的编译时和运行时错误。 我们是否会因为无意中使用了一个不正确支持运行时的语言特性而得到运行时错误,如果我们在langversion中使用“最新”?例如,使用langversion latest,我们能够使用c# 8.0及以上支持的新()操作符和using声明,即使.NET Framework仅支持7.3版本。 祝好!

1
不是运行时错误。你得不到框架不支持的任何东西。 - Daniel A. White
例如,使用langversion latest,即使.net框架只支持7.3版本,我们也能够使用c# 8.0及以上版本支持的new()运算符和using声明。这是一个陈述句。 - Dai
@DanielA.White 你能解释一下“选择比默认版本更新的语言版本可能会导致难以诊断的编译时和运行时错误”是什么意思吗?这是否意味着将Langversion设置为11.0而不是latestversion? - MBeckius
我认为在.NET Framework 4.x项目中,除非您使用多目标netcoreapp3.1或netstandard2.1与net48,否则无法使用C# 8.0功能。 - Dai
1
@Dai 不支持多目标。试一下,只需创建一个 .net framework 4.x 控制台应用程序,然后尝试像这样做:Object t = new(); 它不会编译。然后在 csproj 中添加 langversion latest,它就可以编译和运行了。 - MBeckius
显示剩余4条评论
1个回答

2
我不确定如果我们在langversion中使用“latest”,是否会出现运行时错误,因为我们可能无意中使用了运行时不支持的语言特性。例如,使用langversion latest,我们可以使用new()操作符和using声明,这些特性仅在c# 8.0及以上版本中受支持,即使.net framework只支持7.3版本。
我认为运行时错误主要与“latest”相关,因为它可以在更新Visual Studio时突然从10.0切换到11.0,从11.0切换到12.0等等。没有保证例如一些超新的C# 12将在运行时级别上完全兼容.NET Framework 4.x。
因此,我更喜欢使用.NET Framework的LangVersion的确切值-9.0对我来说已经足够了。
据我所知,.NET Framework和C# 9.0的组合在运行时没有重大潜在错误,至少如果您仅使用C# 9的语法糖部分。
无论如何,除了C# 9的语法糖部分外,其他所有事情都应该小心使用,如下面的链接所述。
虽然在C# 8和9中仍有一些功能可以在我们的旧目标上工作,但这些剩余的功能需要额外的注意,以使Roslyn编译器正常工作。具体来说,这些是向后兼容的功能,但需要在项目中存在某些特定的类型或属性。好消息是,如果我们缺少库,我们可以从NuGet引用它们,如果我们缺少类型,我们可以直接从GitHub上的CoreCLR源代码中复制并粘贴到我们的项目中!实际上,C#编译器并不需要这些类型内置-只要它能在正确的位置找到它们,就足以成功构建我们的代码。因此,让我们逐个浏览所有剩余的功能!

https://sergiopedri.medium.com/enabling-and-using-c-9-features-on-older-and-unsupported-runtimes-ce384d8debb


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接