旧编译器的空安全解除引用运算符?

时间:2017-02-02 15:10:43

标签: c#-4.0

我有一个旧的编译器服务器(VS 2010),显然无法编译这样的指令:

var result = a?.b()?.c?.d;

我可以使用替代品吗?是否可以通过表达式树来完成此操作?例如,像这样:

var result = NullSafe(()=> a.b().c.d);

1 个答案:

答案 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);

至少可以说,实施有点牵连。