我注意到像下面这样的代码片段,它用警告标记属性初始化.

public sealed class C(int a)
{
    public int A { get; } = a;  //<--here

    public int Sum(int b)
    {
        return a + b;
    }
}

警告说:

警告CS9124:参数‘int a’被捕获到 封闭类型及其值也用于初始化字段, 属性或事件.

但是,如果我省略了任何进一步的a变量用法,该警告就会消失.

public sealed class C(int a)
{
    public int A { get; } = a;

    public int Sum(int b)
    {
        return b;  //<-- no more 'a' used here
    }
}

现在,虽然我有嫌疑人,但我不太清楚发出警告的原因.是否因为在这种情况下,类中的任何a修改都不会更改A属性?

推荐答案

这是因为编译器将为Sum中使用的a生成一个支持字段,并为汽车属性A生成另一个支持字段.

请注意,a是可变的,而A不是,因此您可以这样做:

public void MutateA(int i) => a += i;

这将影响Sum,但不会影响A:

C c = new C(42);
c.MutateA(7);
Console.WriteLine(c.A); // Prints 42
Console.WriteLine(c.Sum(0)); // Prints 49

public sealed class C(int a)
{
    public int A { get; } = a;  //<--here

    public int Sum(int b)
    {
        return a + b;
    }

    public void MutateA(int i) => a += i;
}

解决方法/修复方法是使用A而不是Sum中的a:

public int Sum(int b) =>  A + b;

另见:

Csharp相关问答推荐

我可以将Expressc操作设置为在另一个Expressc操作完成后自动发生吗?

EF Core Fluent API中定义的多对多关系

获取ASP.NET核心身份认证cookie名称

为什么我的ASP.NET核心MVC应用程序要为HTML元素添加一些标识符?

. net依赖注入如何避免服务类中的新

如何删除文件的基础上嵌入的时间戳嵌入文件名

不带身份的Blazor服务器.Net 8 Cookie身份验证

如何在不考虑年份的情况下判断日期时间是否在某个日期范围内?

如何在C#中将方法/线程启动传递给基本构造函数

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

RabbitMQ群集的MassTransit配置问题

如何防止Visual Studio断点以红色突出显示到整行?

如何在不复制或使用输出的情况下定义项目依赖

Celler ArgumentExpression是否期望在所有情况下都捕获允许空值的运算符?

WPF动态设置弹出窗口水平偏移

将字符串类型日期输入(yyyy-mm-ddthh:mm:ss)转换为MM/dd/yyyy格式

如何消除Visual Studio错误,因为它不识别集合表达式的新C#12语法?

实体框架允许您具有筛选的属性吗?

缩写的MonthNames有问题

如何获取我在SQL中输入的值