带有Nullable <value>types的条件运算符赋值?
EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : Convert.ToInt32(employeeNumberTextBox.Text),
我经常发现自己希望做这样的事情( EmployeeNumber
是一个Nullable<int>
因为它是列允许NULL值的LINQ到SQL的dbml对象的属性)。 不幸的是,编译器认为“虽然这两种types在赋值操作中都是有效的,但它们之间没有”null“和”int“之间的隐式转换。
由于需要在.Textstring上进行内联转换(如果它不为null),我可以看到空合并运算符不是一个选项。
据我所知,唯一的方法是使用if语句和/或分两步进行分配。 在这种特殊情况下,我觉得非常令人沮丧,因为我想使用对象初始值设置语法,而这个赋值就在初始化块中。
任何人都知道更优雅的解决scheme
发生这个问题是因为条件运算符没有看如何使用(在这种情况下分配的)值来确定expression式的types – 只是真/假的值。 在这种情况下,您有一个null和一个Int32 ,并且types不能确定(有真正的原因,它不能只是假设Nullable <Int32> )。
如果你真的想这样使用它,你必须将其中的一个值转换为Nullable <Int32> ,所以C#可以parsingtypes:
EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? (int?)null : Convert.ToInt32(employeeNumberTextBox.Text),
要么
EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : (int?)Convert.ToInt32(employeeNumberTextBox.Text),
我认为一个实用的方法可以帮助使这个更清洁。
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); } }
然后
EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);
虽然亚历克斯提供了正确和近端的答案您的问题,我更喜欢使用TryParse
:
int value; int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value) ? (int?)value : null;
这是更安全,照顾无效input的情况下,以及您的空string情况。 否则,如果用户input像1b
这样的东西,它们将会出现一个错误页面,并在Convert.ToInt32(string)
引起未处理的exception。
您可以投射转换的输出:
EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : (int?)Convert.ToInt32(employeeNumberTextBox.Text)
//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;
编辑:上面的简短说明,我试图获取Posid
(如果它的Posid
int
和具有大于0值)的值。 我不得不使用Posid.Value
(int?)
来获得条件运算符不抛出任何编译错误。 只是一个FYI GetHolidayCount
是一个WCF
方法,可以给null
或任何数字。 希望有所帮助