有没有办法实现和使用“NOT null coalescing”运算符?

时间:2014-01-29 08:10:20

标签: c# .net null-coalescing-operator null-coalescing

C#中是否有 null合并运算符,以防万一,例如:

public void Foo(string arg1)
{
    Bar b = arg1 !?? Bar.Parse(arg1);   
}

以下案例让我想到了它:

public void SomeMethod(string strStartDate)
{
    DateTime? dtStartDate = strStartDate !?? DateTime.ParseExact(strStartDate, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture);
}

我可能没有strStartDate信息,以防null但如果我这样做;我始终确定它将采用预期的格式。因此,不要初始化dtStartDate = null并尝试parse并在try catch块内设置值。它看起来更有用。

我认为答案是否定的(并且没有这样的运算符!??或其他任何东西) 我想知道是否有实现这种逻辑的方法,它是否值得,以及它会变得有用的情况。

2 个答案:

答案 0 :(得分:6)

Mads Torgersen公开表示,对于下一版本的C#,正在考虑使用零传播运算符(但也强调这并不意味着它将存在)。这将允许代码:

var value = someValue?.Method()?.AnotherMethod();

如果操作数(左侧)为?.,则null返回null,否则将评估右侧。我怀疑这会让你在很多方面,特别是如果与(比方说)扩展方法相结合;例如:

DateTime? dtStartDate = strStartDate?.MyParse();

其中:

static DateTime MyParse(this string value) {
    return DateTime.ParseExact(value, "dd.MM.yyyy",
         System.Globalization.CultureInfo.InvariantCulture
);

然而!您可以使用扩展方法立即执行相同的操作

DateTime? dtStartDate = strStartDate.MyParse();

static DateTime? MyParse(this string value) {
    if(value == null) return null;
    return DateTime.ParseExact(value, "dd.MM.yyyy",
         System.Globalization.CultureInfo.InvariantCulture
);

答案 1 :(得分:2)

只需使用三元conditional operator ?:

DateTime? dtStartDate = strStartDate == null ? null : DateTime.ParseExact(…)

您提议的运算符实际上并不容易,因为它具有不一致的类型:

DateTime? a = (string)b !?? (DateTime)c;

要使此表达式起作用,编译器需要知道在编译时 b为空,以便可以将(null)字符串值赋给{{1} }。