为何Nullable<int>未实现IFormattable却可转换为该接口?
关于Nullable与IFormattable接口的疑问
问题场景
通过以下代码可以确认Nullable<int>(即int?)类型并未显式实现IFormattable接口:
var doesImplement = typeof(Nullable<long>).GetInterface(nameof(IFormattable)) != null;
但执行以下代码时,却能成功将int?转换为IFormattable并得到格式化结果:
int? a = 11111; var formatted = ((IFormattable)a)?.ToString("N0", null); // formatted 结果为 "11,111"
解答
- 存在对应的显式转换,但该转换并非定义在
Nullable<T>类中,而是CLR的内置特殊处理逻辑。 - 当
Nullable<T>的基础类型T本身实现了IFormattable接口时(比如int、long都实现了该接口),CLR会允许将非空的Nullable<T>实例显式转换为IFormattable。转换的本质是直接操作Nullable<T>内部的Value属性,将基础类型的实例转换为对应的接口类型。 - 这种转换属于运行时的适配规则,并非
Nullable<T>显式声明的转换运算符。这也是为什么用typeof(Nullable<T>).GetInterface检测不到接口实现的原因——Nullable<T>本身并没有实现IFormattable,只是CLR在运行时为其做了特殊适配。
内容的提问来源于stack exchange,提问作者Shahryar Saljoughi
相关产品推荐
相关产品推荐

