首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Nullable不是ValueType

Nullable不是ValueType
EN

Stack Overflow用户
提问于 2011-07-13 03:56:15
回答 3查看 326关注 0票数 8

如果您查看.NET Nullable的文档,您将看到:

代码语言:javascript
运行
复制
   struct Nullable<T>

注意,它是一个结构,而不是一个类。

似乎struct Nullable<T>而不是a ValueType,这是非常出乎意料的。以下代码打印为False:

代码语言:javascript
运行
复制
   Type nullableType = typeof(Nullable<int>);
   Console.WriteLine(nullableType is ValueType);

如果您查看生成的IL,您将看到编译器在编译时将nullableType确定为ValueType。但是,如果它是一个结构,它怎么可能是一个ValueType呢?所有的结构都是ValueTypes,对吗?很明显,这与通用相关。

我在这里错过了什么?这方面的语言规范有什么规定吗?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2011-07-13 04:05:45

您正在测试System.Type是否是值类型。事实并非如此。把它重写如下:

代码语言:javascript
运行
复制
Nullable<int> test = 42;
Console.WriteLine(test is ValueType);
票数 15
EN

Stack Overflow用户

发布于 2011-07-13 04:06:16

它是一种值类型,请尝试这样做:

代码语言:javascript
运行
复制
Type nullableType = typeof(Nullable<int>);
Console.WriteLine(nullableType.IsValueType);

那应该是真的。希望这能有所帮助。

票数 12
EN

Stack Overflow用户

发布于 2011-07-26 17:26:16

Nullable<T>是一个泛型类型族,既不遵守值类型的规则,也不遵守类类型的规则。检查对象类型的运行时方法需要装箱。如果一个HasValue属性的Nullable<T>true,那么尝试将其装箱,就会将它分解为一个T并将其装箱。否则,尝试将其装箱将产生null。在任何情况下,它都不会被装箱为一个Nullable<T>。可以为Nullable<T>构造一个types,这样一个Type对象的IsValueType将返回true,对内存使用情况的分析将确认Nullable<T>是作为值类型存储的,但是由于它不遵守适用于所有其他值类型的一些规则,所以最好将`Nullable<T>作为一种独特的实体。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6673890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档