我只是好奇"为什么空传播运算符不(或不能(提供有关类型的任何信息,例如在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();