为什么 Nullable<T> 的 null-传递返回 T 而不是 Nullable<T>?

5
请给出需要翻译的内容。
Nullable<DateTime> dt;

dt. <-- Nullable<DateTime>
dt?. <-- DateTime

空值传播(null propagation)返回T,而不是Nullable<T>

为什么?怎么实现的呢?


嗯,如果每次只有在有值时才调用.Value是毫无意义的,因此他们可能决定将其视为类似于提升运算符的方式处理? - Marc Gravell
1个回答

5
由于 null 传播的方式,如果左侧的对象为空,则右侧的对象永远不会被执行。因为您知道右侧的对象永远不可能为 null,所以它会方便地去掉 Nullable,这样您就不需要每次都输入 .Value。
您可以把它看作是:
public static T operator ?.(Nullable<U> lhs, Func<U,T> rhs) 
    where T: class
    where U: struct
{
    if(lhs.HasValue)
    {
        return rhs(lhs.Value);
    }
    else 
    {
        return default(T);
    }
}

上述代码不是合法的C#代码,但它确实会产生这样的行为。


1
当你说“它剥离了Nullable”时,这本质上是语法糖吗? - Matthew Layton
是的,这就是本质。它会为您调用.Value,因此您不需要自己调用。 - Scott Chamberlain
我明白了。我猜测上面的代码无法工作是因为空值传播运算符无法被重载? - Matthew Layton
1
我的意思是,由于它以“正常”的方式执行相同的操作,如果您像这样使用它 bool? value = myObject?.booleanValue,返回一个 Nullable<value_type>,所以它必须也能以相反的方式工作,这并不令人惊讶。 而且,你幸运的是不能重载这个运算符,那将是一场灾难:D - Ray
我可以为TU的所有类和结构的组合制作重载,但我不知道那是否有帮助。如果您需要它们,我可以添加它们。 - Scott Chamberlain

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