我只是好奇“为什么空传播运算符确实(或可以)不提供有关类型的任何信息,例如在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
修改
Nullable<string>
是不可编辑的代码。
但我不是在修理它。因为这个例子已经回答了这个问题,任何一个团体都可以很容易地解决我所要求的问题。答案 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();