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
块内设置值。它看起来更有用。
我认为答案是否定的(并且没有这样的运算符!??
或其他任何东西)
我想知道是否有实现这种逻辑的方法,它是否值得,以及它会变得有用的情况。
答案 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} }。