编译器看不到不可为空的字段是在构造函数中初始化的,因为字段是在调用构造函数的方法中初始化的.我打开了switch ,让警告变成项目中的错误.为什么会这样呢?

代码示例:

public class TestClass
{
    private List<ColumnWidth> ColumnsWidth;
    public TestClass()
    {
       InitColumnsWidth();
    }

    private void InitDrawingProcess()
    {
       ColumnsWidth = GetRowColumnsWidth(X);
    }

    private List<ColumnWidth> GetRowColumnsWidth(double x)
    {
        var columnsPositions = new List<ColumnWidth>();
        foreach (var widthPct in TableDesign.ColumnsWidth)
        {
            var width = Width * widthPct;
            columnsPositions.Add(new ColumnWidth { X = x, Width = width });
            x += width;
        }

        return columnsPositions;
    }
}

推荐答案

这是因为可为空的分析不够深入,无法检测到这种情况.

但是,您可以通知编译器InitDrawingProcess()确实会初始化该字段,方法是使用MemberNotNull attribute进行修饰,如下所示:

[MemberNotNull(nameof(ColumnsWidth))]
private void InitDrawingProcess()
{
    ColumnsWidth = GetRowColumnsWidth(X);
}

这需要.NET5或更高版本--您使用的是.NET6,所以一切都很好.

Csharp相关问答推荐

为什么Microsoft.AspNetCore. htttp.FormFile不实现IDDisposable?

我无法在Program.cs中实例化我的学生类

由于小数,如何将一个数字四舍五入到下一个数字?

List T.AddRange在传递ConcurrentDictionary作为参数时引发ArgumentExcellent

如何从顶部提取发票号作为单词发票后的第一个匹配

在Dapper中使用IasyncEum重写GetAsyncEum方法

我需要两个属性类吗

安装附加的. exe与Visual Studio

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

WPF DataGrid中的三维数据

在实时数据库中匹配两个玩家的问题

使用Entity Framework6在对象中填充列表会导致列表大多为空

EFR32BG22 BLE在SPP模式下与PC(Windows 10)不连接

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

C#动态设置ServerReport报表参数

Visual Studio,Docker容器-容器调用:连接被拒绝

多个参数的最小API删除

为什么连接到Google OAuth2后,结果.Credential为空?

在Visual Studio 2022中查找Xamarin模板时遇到问题