为什么“file”被视为 C# 中的关键字?

PMF*_*PMF 8 c# file keyword visual-studio-2022

生成以下代码CS9056(“类型和别名不能命名为‘文件’”):

public sealed class file
{

}
Run Code Online (Sandbox Code Playgroud)

在我将 VS 升级到 2022 年预览版 17.4.0 后,会发生这种情况。之前的代码编译得很好。我找不到任何信息表明 thatfile现在是 C# 中的关键字。我尝试翻译的解决方案使用 5.0SDK 进行构建,但目标是 .NET Framework 4.8。

我确实知道类型通常应使用大写名称,并且我可以通过更改为 来解决该问题class fileclass @file但这是在自动生成的文件中,我无法更改生成器。应用一些sed技巧似乎是一种技巧。

为什么file这里被视为关键字以及它的用途是什么?我可以禁用它吗?

gil*_*uck 10

这是 VS 2022 17.4 中编译器引入的更改。file显然现在是类型声明的修饰符。

https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/writing-changes/compiler%20writing%20changes%20-%20dotnet%207

在 Visual Studio 2022 版本 17.4 中引入。从 C# 11 开始,类型不能命名为 file。编译器将报告所有此类类型名称的错误。要解决此问题,类型名称和所有用法必须使用 @ 转义:

class file {} // Error CS9056
class @file {} // No error...
Run Code Online (Sandbox Code Playgroud)

这样做是因为 file 现在是类型声明的修饰符。您可以在相关的 csharplang 问题中了解有关此更改的更多信息。

文档引用的其他链接:https ://github.com/dotnet/csharplang/issues/6011

  • @PMF:如果您可以使用“<LangVersion>”显式设置为“10”或更低的项目重现此问题,我会提交一个错误,无论是否作为预览,它不应该应用 C# 11 规则在这种情况下,无论目标框架如何。如果未指定“<LangVersion>”或将其设置为“预览”,则存在问题。或者,当然,不要将 VS 的*预览*版本用于生产代码——它处于预览状态是有原因的。 (3认同)