4

是否有一个 空合并运算符C#可以在其中使用,例如:

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它似乎更有用。

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

4

2 回答 2

6

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

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

如果操作数(左侧)是,则?.返回,否则将评估右侧。我怀疑这会给您带来很多好处,尤其是与(比如说)扩展方法结合使用时;例如:nullnull

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
);
于 2014-01-29T08:23:56.100 回答
2

只需使用三元条件运算符?:

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

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

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

为了使这个表达式起作用,编译器需要在编译时知道它b是空的,以便可以将 (null) 字符串值分配给a.

于 2014-01-29T08:14:35.803 回答