using System;
public class C {
    public void Main() {
        
        int j1=5;
        int? j=7;
    }
}

以下是初始化j1j的IL代码

 IL_0000: nop
    IL_0001: ldc.i4.5
    IL_0002: stloc.0
    IL_0003: ldloca.s 1
    IL_0005: ldc.i4.7
    IL_0006: call instance void valuetype [System.Runtime]System.Nullable`1<int32>::.ctor(!0)

从IL中我可以看到,当我使用Int32时,不会调用任何构造函数,但当我使用Nullable时,会调用一个构造函数,以便将值放入变量中.
为什么会这样?
我只能想象这是因为Nullable类型必须能够为Null,但在内部 struct 中既可以是非Null类型,也可以是Null类型.那么为什么Int32没有构造函数呢?

所有这一切都考虑到了Jon Skeet的答案,即当可为空的int32为空时,它不会指向任何地方,但它本身就是空的. ? (nullable) operator in C#

推荐答案

这是Reference Source of struct Nullable<T>美元.

它有这样一个构造函数:

public Nullable(T value) {
    this.value = value;
    this.hasValue = true;
}

ValueHasValue属性是纯getter属性.这意味着必须调用构造函数才能为Nullable<T>赋值.

没有像独立的、可以为空的7常量这样的东西.Nullable<T>对分配给它的值进行换行.

顺便提一下,null是通过直接将存储器位置设置为0并绕过根据Jb Evain's answer to: How does the assignment of the null literal to a System.Nullable type get handled by .Net (C#)?的构造函数来赋值的.

Csharp相关问答推荐

如何使用Automapper映射两个嵌套列表

在Linq中调用需要limit和offset的方法''''

将委托传递到serviceccollection c#web API

什么是通过反射创建类的泛型接口方法的正确方法?

为什么在ANTLR4中会出现不匹配的输入错误?""

C#.NET依赖项注入顺序澄清

在调整大小的控件上绘制

TCPClient阅读流

更改执行目录

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

在IAsyncEnumerable上先调用,然后跳过(1)可以吗?

CA1508:';NULL=>;TRUE;始终为';TRUE';.移除或重构条件(S)以避免死代码

有条件地定义预处理器指令常量

CRL已过期,但ChainStatus告诉我RevocationStatus未知

KeyDown从我的文本框中删除输入,如何停止?

流畅的验证--如何为属性重用规则?

仅在ASP.NETCore应用程序中的附加单独端口上公开一组终结点

使用ImmutableList时,DynamicData未按预期工作

C#:我需要根据换行符拆分字符串,而不是在字符串中用双引号分隔换行符