使用 FieldInfo.SetValue 将 ValueType 设置为 null 不应该失败吗?

Shouldn't using FieldInfo.SetValue to set a ValueType to null fail?

提问人:Sebastian Good 提问时间:8/25/2010 最后编辑:CommunitySebastian Good 更新时间:6/27/2021 访问量:821

问:

(与 PropertyInfo、SetValue 和 null 相关)

如果我有 、 和 a 指向该字段,为什么调用是合法的?运行时将字段设置为零,即 而不是抱怨 a 不能设置为 .public class Thing { public int X; }Thing oFieldInfo fiXfi.SetValue(o, null)Xdefault(int)ValueTypenull

有谁知道这种行为背后的设计选择,至少从 C# 来看,它违反了我的最小惊讶原则?

.NET CLR 最小惊讶

评论

0赞 leppie 8/25/2010
我同意,至少根据文档,它应该抛出一个 ArgumentException。
0赞 Doug 12/9/2016
对于反射 API 来说,这是令人沮丧的行为

答:

4赞 Rob 8/29/2010 #1

“例外”框中包含的文本表明传入的值需要转换,这将解释它成功的原因。ArgumentException

value 参数不能转换并存储在字段中。

我确实同意这似乎有点奇怪,特别是因为我通常认为反射 API 是更严格、更不宽容的 API 之一。

您可以尝试联系 Eric Lippert ,虽然这是一个 BCL/CLR 问题而不是 C#,但他有可能知道答案或认识知道答案的人。要么这样,要么能够给出一个很好的猜测。