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

C#:带字段初始化器的Struct作为Dictionary值,为何TryGetValue返回默认值?

为什么Dictionary.TryGetValue返回的结构体默认实例字段值和直接new的不一样?

先看你给出的代码示例:

internal class Program {

    struct Test {
        public int a = 10;
        public Test() { }
    }

    static Dictionary<int, Test> map = new Dictionary<int, Test>();

    static void Main(string[] args) {

        Console.WriteLine(new Test().a); // 输出10:正常
        map.TryGetValue(0, out Test test);
        Console.WriteLine(test.a);  // 输出0:不符合预期!
    }
}

这种差异的核心在于结构体的两种初始化逻辑完全不同:

  • 当你显式调用new Test()时,会执行你定义的构造函数以及字段的初始化赋值,所以字段a会被设置为你指定的10。
  • 而Dictionary.TryGetValue在找不到对应键时,会给out参数赋值为结构体的默认实例(等价于default(Test))。这种默认初始化不会执行你自定义的构造逻辑,只会把结构体的所有字段设置为对应类型的默认值——int类型的默认值是0,所以这里test.a输出0。

官方文档明确提到,数组或集合这类内部存储包含变量块的场景,会使用默认值初始化方式,Dictionary.TryGetValue的行为就属于这种情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:46:01