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

Seb*_*ood 6 .net clr least-astonishment

(与PropertyInfo SetValue和nulls相关)

如果我有public class Thing { public int X; },a Thing o和a FieldInfo fi指向该X字段,为什么打电话合法fi.SetValue(o, null)?运行时将字段X设置为零,即default(int)不是抱怨a ValueType不能设置为null.

有没有人知道这种行为背后的设计选择,至少从C#中违背了我最不惊讶的原则?

Rob*_*Rob 4

Exceptions 框中包含的文本ArgumentException表明传入的值需要进行conversion,这可以解释为什么它会成功。

value 参数无法转换并存储在字段中。

我确实同意这看起来有点奇怪,特别是因为我通常期望反射 API 是更严格和更不宽容的 API 之一。

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