为什么C#Null条件运算符不返回Nullable <t>?

时间:2017-02-07 07:09:41

标签: c#

我只是好奇“为什么空传播运算符确实(或可以)不提供有关类型的任何信息,例如在Nullable<int>类型中返回null?”

由于它返回的null没有类型,因此结果值无法传递扩展方法。

class User {
     public string Name { get; set; }
     public User Father { get; set; }
}

var user = new User ( );


public static class Extensions {
    public static string X (this string p) => "EXTENSION METHOD";
}

C#交互式窗口:

> var user = new User();
> user.Father
null
> user.Father.Name
Object reference not set to an instance of an object.
> user.Father?.Name
null
> user.Father?.Name.X()
null

修改

  • 由于@ScottChamberlain指出Nullable<string>是不可编辑的代码。 但我不是在修理它。因为这个例子已经回答了这个问题,任何一个团体都可以很容易地解决我所要求的问题。

1 个答案:

答案 0 :(得分:13)

问题不在于返回类型,而是事实。如果为空,则根本不处理右侧。

你可以想到

var result = user.Father?.Name.X()

执行

string result;
var testObject = user.Father;
if(!Object.RefrenceEquals(testObject, null))
{
    result = testObject.Name.X();
}
else
{
    result = null;
}

因为Father为空,所以除了它之外没有任何东西被执行。

如果你为它添加一个parentisis来强制.?的结果与扩展方法一起使用它可以正常工作

var result = (user.Father?.Name).X()

执行

string tempResult;
var testObject = user.Father;
if(!Object.RefrenceEquals(testObject, null))
{
    tempResult = testObject.Name;
}
else
{
    tempResult = null;
}
var result = tempResult.X();