带有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或任何数字。 希望有所帮助