能否在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
相关产品推荐
相关产品推荐

