关于c#:使用Nullable< value>的条件运算符赋值

Conditional operator assignment with Nullable<value> types?

1
2
3
4
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : Convert.ToInt32(employeeNumberTextBox.Text),

我经常发现自己想做这样的事情(EmployeeNumberNullable,因为它是linq to sql dbml对象的属性,其中列允许空值)。不幸的是,编译器认为"在'null'和'int'之间没有隐式转换",即使这两种类型在赋值操作中对其自身可以为空的int都有效。

据我所见,空合并运算符不是一个选项,因为如果.text字符串不为空,则需要对其进行内联转换。

据我所知,唯一的方法是使用if语句和/或分两步分配它。在这种特殊的情况下,我发现非常令人沮丧,因为我想使用对象初始值设定项语法,而这个赋值将在初始化块中…

有人知道更优雅的解决方案吗?


出现问题的原因是条件运算符不考虑如何使用值(在本例中是赋值)来确定表达式的类型——只考虑真/假值。在这种情况下,您有一个空值和一个Int32,并且无法确定类型(有一些真正的原因,它不能仅仅假设为Nullable)。

如果您真的想以这种方式使用它,您必须将其中一个值强制转换为nullable您自己,这样C可以解析类型:

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);


虽然亚历克斯对你的问题给出了正确和接近的答案,但我更喜欢使用TryParse

1
2
3
4
int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
    ? (int?)value
    : null;

它更安全,可以处理无效输入的情况以及空字符串场景。否则,如果用户输入类似于1b的内容,则会显示一个错误页,其中包含Convert.ToInt32(string)中导致的未处理异常。


您可以强制转换输出:

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;

编辑:简单解释一下,我试图得到在变量X1Posid的值(如果它的值不是空的int且大于0)。我不得不在Posid.Value上使用(int?),以使条件运算符不抛出任何编译错误。仅仅一个Fyi-GetHolidayCount是一个WCF方法,它可以给null或任何数字。希望有所帮助