如何在空字符串上应用Null-Conditional运算符?

时间:2015-10-23 10:09:29

标签: c# c#-6.0

我有一个字符串值,需要将其转换为十进制。

var str = null;           
decimal number;
decimal d = Decimal.TryParse(str, out number) ? number : 0M;

它工作正常。

现在我试图通过使用C#6.0的新Null-Conditional Operator来实现同样的目标。我怎么能这样做?

我知道这是一次错误的尝试。

 var str = null;
 decimal d = str?.Convert.ToDecimal(str);

3 个答案:

答案 0 :(得分:5)

空白(空)字符串不是null,因此您无法使用该运算符。

你可以这样做:

decimal d = string.IsNullOrEmpty(str) ? 0M : Convert.ToDecimal(str);

编辑:好的,现在我们开始使用null字符串。在这种情况下......

decimal d = (str == null) ? 0M : Convert.ToDecimal(str);

我仍然不认为这是使用空条件运算符的合适时间,因为当表达式的最终结果为null时,这是最有用的 - 在您的情况下不是这样。

答案 1 :(得分:3)

According to msdn你不能这样做,因为空条件运算符是:

  

用于在执行成员访问(?。)或索引之前测试null   (?[]操作

在这种情况下,您不会索引或访问输入字符串成员。

正如另一个答案所述,这样做的方法是

decimal d = String.IsNullOrEmpty(str) ? default(decimal) : Convert.ToDecimal(str);

答案 2 :(得分:0)

不完全回答这个问题,但我会创建一个扩展方法,您可以在null值上正式调用它。

如果输入字符串的格式有效(使用默认格式),则此实现提供正确的double,如果字符串为null或为空或格式不正确,则提供可选的传递默认值。

public static double ConvertToDoubleOrDefault(this string input, double def = 0.0) 
{
  if (string.IsNullOrEmpty(str)) return def;
  double result;
  if (!double.TryParse(str, out result)) return def;
  return result; 
}

....

string test = "1234";
string test2 = null;
var d = test.ConvertToDoubleOrDefault(); // => 1234
d = test2.ConvertToDoubleOrDefault(); // => 0.0