Conditional operator assignment with Nullable<value> types?
1 2 3 4 | EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : Convert.ToInt32(employeeNumberTextBox.Text), |
我经常发现自己想做这样的事情(
据我所见,空合并运算符不是一个选项,因为如果.text字符串不为空,则需要对其进行内联转换。
据我所知,唯一的方法是使用if语句和/或分两步分配它。在这种特殊的情况下,我发现非常令人沮丧,因为我想使用对象初始值设定项语法,而这个赋值将在初始化块中…
有人知道更优雅的解决方案吗?
出现问题的原因是条件运算符不考虑如何使用值(在本例中是赋值)来确定表达式的类型——只考虑真/假值。在这种情况下,您有一个空值和一个Int32,并且无法确定类型(有一些真正的原因,它不能仅仅假设为Nullable
如果您真的想以这种方式使用它,您必须将其中一个值强制转换为nullable
1 2 3 4 | EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? (int?)null : Convert.ToInt32(employeeNumberTextBox.Text), |
或
1 2 3 4 | EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : (int?)Convert.ToInt32(employeeNumberTextBox.Text), |
我认为实用的方法可以使这个更干净。
1 2 3 4 5 6 7 | public static class Convert { public static T? To<T>(string value, Converter<string, T> converter) where T: struct { return string.IsNullOrEmpty(value) ? null : (T?)converter(value); } } |
然后
1 | EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse); |
虽然亚历克斯对你的问题给出了正确和接近的答案,但我更喜欢使用
1 2 3 4 | int value; int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value) ? (int?)value : null; |
它更安全,可以处理无效输入的情况以及空字符串场景。否则,如果用户输入类似于
您可以强制转换输出:
1 2 3 | EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : (int?)Convert.ToInt32(employeeNumberTextBox.Text) |
1 2 3 | //Some operation to populate Posid.I am not interested in zero or null int? Posid = SvcClient.GetHolidayCount(xDateFrom.Value.Date,xDateTo.Value.Date).Response; var x1 = (Posid.HasValue && Posid.Value > 0) ? (int?)Posid.Value : null; |
编辑:简单解释一下,我试图得到在变量