我们有一个 .NET Framework 4.x 项目,其语言版本设置为以下内容:
<LangVersion>latest</LangVersion>
根据文档
最新的 C# 编译器根据项目的目标框架确定默认语言版本。 Visual Studio 不提供用于更改该值的 UI,但您可以通过编辑 csproj 文件来更改它。选择默认值可确保您使用与目标框架兼容的最新语言版本。您可以受益于访问与您的项目目标兼容的最新语言功能。 此默认选择还可以确保您不会使用需要目标框架中不可用的类型或运行时行为的语言。选择比默认版本更新的语言版本可能会导致难以诊断编译时和运行时错误。
我不清楚;通过使用“最新”作为
langversion
,我们是否会因为无意中使用了运行时未正确支持的语言功能而出现运行时错误?
例如,通过
langversion
latest
,我们可以使用 new()
运算符并使用 C# 8.0 及更高版本中支持的声明,即使 .NET Framework 仅支持最高版本 7.3。
我不清楚如果我们使用“最新”作为语言版本可以 我们遇到运行时错误,因为我们无意中使用了一种语言 运行时未正确支持的功能?例如, 通过最新的 langversion,我们可以使用 new() 运算符并且 使用 c# 8.0 及更高版本支持的声明 .net框架仅支持7.3版本。
我认为运行时错误主要与“最新”相关,在更新 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# 9 的语法糖部分无关)应该谨慎使用,如下面的链接所述。
虽然 C# 8 和 9 中还剩下一些可以使用的功能 我们较旧的目标,剩下的这些目标将需要额外的照顾 为了让 Roslyn 编译器满意。具体来说,这些是 向后兼容的功能,但确实需要一些特定的 项目中存在的类型或属性。好消息是 如果我们缺少库,我们可以从中引用它们 NuGet,如果我们错过了类型,我们实际上可以从 GitHub 上的 CoreCLR 源代码并将它们粘贴到我们的项目中! C# 编译器实际上并不需要内置这些类型——只要 因为它可以在正确的位置找到它们,这足以让它 成功构建我们的代码。那么,让我们来看看剩下的所有内容 功能一一列出!