VS2022中C# 11的field关键字不支持问题求助
解决方法
1. 确保项目语言版本正确配置
直接编辑项目的.csproj文件,在<PropertyGroup>节点中明确指定C# 11版本,避免VS属性设置不生效:
<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net7.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <!-- 明确指定C#版本 --> <LangVersion>11.0</LangVersion> </PropertyGroup>
保存后重新加载项目,确认VS右下角状态栏显示的语言版本为C# 11.0。
2. 验证SDK版本与项目的关联
虽然你安装了支持C# 11的.NET 7.0.200 SDK,但需确保项目实际使用该版本:
- 在VS中打开「工具」→「选项」→「项目和解决方案」→「.NET Core」,确认「使用.NET Core SDK版本」选择的是
7.0.200(或最新稳定版)。 - 也可以在.csproj中添加
<RollForward>LatestMinor</RollForward>,强制使用最新的同主版本SDK。
3. 修正代码写法(避免语法与逻辑问题)
你的重构代码中,UpdateDepth is 0会触发get访问器,虽然逻辑上没问题,但更严谨的写法是直接用field引用幕后字段,同时确保C# 11语法正确:
private int UpdateDepth { get; set { field = value; if (!SkipHandlers && !SkipCallbacks && field == 0) RunGameDataChangedCallback(); } }
如果还是报错,可临时回退到兼容写法(同时满足ReSharper的优化提示):
// 自动属性+构造函数初始化 private int UpdateDepth { get; set; } public GameControl() { UpdateDepth = 0; }
或者手动保留字段但简化写法:
private int _updateDepth; private int UpdateDepth { get => _updateDepth; set => (_updateDepth = value) switch { 0 => RunGameDataChangedCallback(), _ => {} }; }
4. 清理VS与ReSharper缓存
VS预览版的缓存可能导致语言版本识别异常:
- 关闭VS,删除项目根目录下的隐藏
.vs文件夹; - 执行命令清理NuGet缓存:
dotnet nuget locals all --clear; - 打开ReSharper→「选项」→「代码编辑」→「C#」→「C#语言级别」,设置为
C# 11.0,重启VS后重新生成项目。
内容的提问来源于stack exchange,提问作者Manus Hand
相关产品推荐
相关产品推荐

