我有一个旧的编译器服务器(VS 2010),显然无法编译这样的指令:
var result = a?.b()?.c?.d;
我可以使用替代品吗?是否可以通过表达式树来完成此操作?例如,像这样:
var result = NullSafe(()=> a.b().c.d);
答案 0 :(得分:3)
在它成为语言功能之前,有很多尝试这样做。现在找到引用有点困难,但你可以知道它是如何完成的以及为什么不这么简单。
例如,This snippet看起来很简单:
SIG_IGN
您几乎可以像操作员一样使用它:
SA_RESTART
但是它不适用于值类型。这个older snippet使用EqualityComparer:
public static R NullSafe<T, R>(this T obj, Func<T, R> f) where T : class
{
return obj != null ? f(obj) : default(R);
}
需要花一些时间来寻找更完整的例子。我记得在找到更完整的方法之前尝试类似于这些方法的方法。
This SO answer to a similar question取消了链接并允许人们写:
deliveryCode = order.NullSafe(o => o.DeliveryCompany).NullSafe(dc => dc.FileArtworkCode);
至少可以说,实施有点牵连。