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

