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

gun*_*sus 4 c#

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

由于它返回的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";
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

编辑:

  • 正如@ScottChamberlain所说,这Nullable<string>是一个不可编译的代码.但我不是在修理它.因为这个例子已经回答了这个问题,所以任何机构都可以很容易地解决我所要求的问题.

Sco*_*ain 13

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

你可以想到

var result = user.Father?.Name.X()
Run Code Online (Sandbox Code Playgroud)

执行为

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

因为Father没有超出它的任何东西被执行.

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

var result = (user.Father?.Name).X()
Run Code Online (Sandbox Code Playgroud)

执行为

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