C# 为什么使用int的默认运算符?不一致?

C# 为什么使用int的默认运算符?不一致?,c#,.net,default-value,C#,.net,Default Value,为什么default返回不同的值?这是因为空合并运算符吗 代码(FYI.Dump()来自LinqPad): 对于此处的简单变量声明语句: int?a=默认值; default始终是分配变量的类型的默认值。由于您明确声明a的类型为int?,default将等于default(int?) 可空值类型的空合并(??)将尝试返回非空值类型(您的典型结构,在本例中为int) 因此,在本例中: a=foo?巴??违约 default将等于default(int),因为它试图通过操作符返回int对象 在这

为什么
default
返回不同的值?这是因为空合并运算符吗

代码(FYI.Dump()来自LinqPad):


对于此处的简单变量声明语句:

int?a=默认值;
default
始终是分配变量的类型的默认值。由于您明确声明
a
的类型为
int?
default
将等于
default(int?

可空值类型的空合并(
??
)将尝试返回非空值类型(您的典型结构,在本例中为
int

因此,在本例中:

a=foo?巴??违约
default
将等于
default(int)
,因为它试图通过操作符返回
int
对象

在这个例子中:

a=foo?巴??默认值(int?);

由于
default(int?
返回类型为
int?
的对象,它将强制将左手强制转换为
int?
,或将
int?
强制转换为
int
。既然<代码> INT/COM>隐式转换为<代码> int >代码>,NULL聚结运算符将考虑返回<代码> int > />代码。在这种情况下,

代码行:<代码> A= FO?.bar??默认值执行空检查。在将其分配给
a
之前,它将隐式地将其转换为
int
值。至少,这是我的猜测。否则,您会说:
如果为null,则返回null,这使得null检查变得多余。编译器会推断表达式的类型。对于引用类型和可空类型,它将给出null,对于值类型,它将给出0<代码>默认值(int?
将返回
null
a=foo?.Bar??违约
将返回
0
的类型取决于操作数和可用的转换。因为
default
文本在该上下文中没有类型(它的类型是从目标推断出来的,这将产生循环问题),所以表达式的类型作为一个整体成为底层可空的类型(
int
,在本例中)这就是
default
的类型。请注意,
foo?.Bar!=无效的foo?.Bar:默认值
会导致
null
,因为
的类型是:表达式被推断为
int?
@arthuratot,但LinqPad扩展方法可以接受头字符串:
somevalue.Dump(“我的头”)??如果
default
没有类型,那么default
应该是编译时错误(如果
default
要有任何类型,那么它肯定必须是指定给它的表达式的变量类型,但显然不是这样)。如果右侧没有类型,则for The null coalescing运算符将强制执行错误,但规则摘要确实解释了该行为。这可能是一个bug。我已经阅读了null升序的文档,但不知何故我还没有意识到这一点。当我读到你的答案时,它变得如此明显
void Main()
{
    Foo foo = null;
    int? a = default;
    a.Dump("a"); // returns null

    a = foo?.Bar ?? default;
    a.Dump("a"); // returns 0

    a = foo?.Bar ?? default(int?);
    a.Dump("a"); // returns null

    (foo?.Bar is null ? default : "ADsf").Dump();
}

class Foo
{
    public int? Bar { get; set; }
}