将空值转换为空的可空布尔值 VS 可空布尔值的默认值。

4

这两种写法有什么区别吗?

int? foo = GetValueOrDefault();

var obj = new
{
    //some code...,
    bar = foo.HasValue ? foo > 0 : (bool?)null
}

VS

int?foo = GetValueOrDefault();

注意:这是字面翻译,可能需要根据具体情况进行调整。

var obj = new
{
    //some code...,
    bar = foo.HasValue ? foo > 0 : default(bool?)
}

2
测试这种东西的快捷方法(比在SO上问要快得多)是使用LINQPad和https://sharplab.io。 作为指南,如果编译成相同的IL,则没有区别。 如果编译为不同的IL,则仍可能没有区别,如果它被JIT编译为同一程序集。 - Jeroen Mostert
@Jodrell:因为那只适用于您编辑过的问题版本,这会改变原始语义,这就是我回滚的原因。在匿名对象声明中,您无法显式指定成员的类型,它必须从表达式中派生。 - Jeroen Mostert
@JeroenMostert,你说得对,我的错。虽然这可能是无用的。 https://dotnetfiddle.net/JPohDD 和 https://sharplab.io/#v2:CYLg1APgAgTAjAWAFBQMwAJboMLoN7LpGYZQAs6AsgBQCU+yAkIwJYB2ALgPzoBmA9v3QBedMACmvAIYBXADYcA3E0YA3KQCd0/AEYArOCPRtxAdxUEkzRgHobAZ34BbcegDG/CQDofAGhWMOppGAvxeABJS9gBqUnIyrjyh6AB86AAM6CDo1DqCcly0bPJyKgC+ylaMKupaunowRibmVZbWdo4u7p7iPl7+VYHBoqERUbHxiXyCqRlZYpKyCrn5heWVzDXB9RiizRYBHc6uHt5+AUFaI4JjMXEJ6EkzaZnZK/wFtBLS8hzrhMQysgykA=== - Jodrell
@Jodrell:在这个上下文中,(bool?) nulldefault(bool?)从C#2开始有效,但是(bool?) default需要C# 7.1。当然,在实践中不太可能出现问题。 - Jeroen Mostert
1个回答

4

它是相同的。一个 Nullable<bool> 是一个结构体,language specification 表示:

结构体的默认值是将所有字段设置为默认值(§15.4.5)所产生的值。

由于 Nullable<T> 有这两个字段:

private bool hasValue; // default: false
internal T value;  // default value of T, with bool=false

所以,使用 default(bool?) 和使用 (bool?)null 是有相同效果的,因为 (bool?)null 也是一个 Nullable<bool>,它的 hasValue=false(与使用 new Nullable<bool>() 相同)。
为什么你可以将 null 分配给一个结构体类型的 Nullable<T>?这是编译器的魔法,不在 源代码 中可见。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接