You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在C#集合初始化器中赋值方法?代码报错寻求解决

在C#集合初始化器中为委托属性赋值的正确姿势

嘿,我来帮你梳理下这个问题——你确实可以在C#集合初始化器里给类的委托/方法属性赋值,但你的代码有几个关键的语法错误,导致编译失败。咱们一步步拆解问题并修正:

1. 先搞定demo类的委托属性声明

你原来的demo类里的委托写法完全错了:

public delegate void currUpd() { get; set; }

这里混淆了委托类型定义和委托属性声明。其实.NET已经给我们内置了无参数无返回值的委托类型Action,直接用它来声明属性就好。另外,你在lambda里用到的intba、totint这些变量,得在demo类里声明出来,否则lambda找不到它们。

修正后的demo类:

public class demo
{
    // 补充lambda中要用到的字段(根据你的逻辑添加)
    public int intba { get; set; }
    public int totint { get; set; }
    public int intp { get; set; }
    public int pp { get; set; }

    public string acst { get; set; }
    // 用Action作为委托属性的类型,完美匹配你的无参数无返回值需求
    public Action currUpd { get; set; }
    public bool st { get; set; }
}

2. 修正集合初始化器的语法错误

你在初始化demo对象时,给currUpd赋值的写法不对:

  • 错误写法:currUpd() = () => { intba += totint; }
  • 正确写法:直接给属性赋值,不需要加(),而且lambda里最好用this明确引用类的成员(避免闭包歧义)

另外第二个demo对象里的= 0是多余的,直接删掉就行。

修正后的集合初始化代码:

List<demo> ags = new List<demo>() 
{ 
    new demo 
    { 
        acst = "One", 
        intba = 0,
        totint = 5, // 给字段赋初始值,否则累加没意义
        currUpd = () => { this.intba += this.totint; }, 
        st = 1 < 2
    }, 
    new demo 
    { 
        acst = "Two", 
        intba = 0,
        intp = 3,
        currUpd = () => { this.intba += this.intp; }, 
        st = 1 < 2 
    }, 
    new demo 
    { 
        acst = "Three", 
        intba = 0,
        pp = 7,
        currUpd = () => { this.intba += this.pp; }, 
        st = 1 < 2 
    } 
}; 

3. 调用委托时的小细节

在遍历调用currUpd之前,最好先判断委托是否为null,避免空引用异常。另外你可以把intba也投影到匿名对象里,方便验证结果:

var agss = ags.Select(x => new { x.acst, x.currUpd, x.st, x.intba }); 

foreach (var item in agss) 
{ 
    if (item.st && item.currUpd != null) 
    { 
        item.currUpd(); 
        // 输出结果看看累加是否生效
        Console.WriteLine($"{item.acst} 执行后 intba = {item.intba}");
    } 
} 

总结下你原来的问题出在哪

  • 委托属性声明错误:把委托类型定义和属性声明混在一起,C#不允许这种写法,必须用明确的委托类型(比如Action)。
  • 集合初始化赋值语法错误:给属性赋值不需要加(),直接用属性名 = 值的格式。
  • 缺少必要字段:lambda里引用的变量没在demo类中声明,编译器自然找不到。

这样修正后,代码就能正常编译运行,完全实现你想要的在集合初始化器中绑定委托,然后遍历执行的功能啦。

内容的提问来源于stack exchange,提问作者larca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:27:58