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

  • 本文关键字:返回 条件运算符 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>是不可编译的代码。但我没有修复它。因为这个问题已经用这个例子回答了,任何人都可以轻松得到我要求的问题。

问题不在于返回类型,而在于 .? 在 null 的情况下根本不处理右侧。

你可以想到

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是空的,所以除了它之外,没有执行任何内容。

如果向其添加括号以强制将.?的结果与扩展方法一起使用,则工作正常

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();