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

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


推荐阅读

    postgresql的ALTER常用操作

    postgresql的ALTER常用操作,字段,数据类型,postgresql版本:psql (9.3.4)1、增加一列ALTER TABLE table_name ADD column_name datatype;

    vb快捷键alt|vbe快捷键

    vb快捷键alt|vbe快捷键,,vb快捷键alt方法/步骤1/4分步阅读打开一份表格,按住键盘当中的快捷键Alt+F112/4弹出表格代码对话框,可以看到该工作

    电信ctlte设置参数|中国电信 ctlte

    电信ctlte设置参数|中国电信 ctlte,,1. 电信ctlte设置参数一、进入设置-更多的菜单,在最上面有通话网络,把启用4G开关开启,二、进入设置-更多

    如何使用UltraISO制作可引导(启动

    如何使用UltraISO制作可引导(启动,系统,文件,如何使用UltraISO制作可引导(启动)U盘PE系统_1、首先将U盘插入电脑的USB接口(重要提示:制作过程U

    开启快捷键alt加tab|启用alt快捷键

    开启快捷键alt加tab|启用alt快捷键,,1. 启用alt快捷键快捷键Alt+Z,方法如下:1、在win当中找到GeForceExperience。2、进入GeForceExperience

    es6 filter方法的参数有哪些

    es6 filter方法的参数有哪些,元素,数组,filter方法接受两个参数:1、一个回调函数,不可省略,用于设置条件来过滤数组元素,并返回数组中满足条件

    电脑LTE怎么用|lte网络怎么弄

    电脑LTE怎么用|lte网络怎么弄,,lte网络怎么弄LTE 网络采用了更扁平化的设计,主要有以下网元:eNodeB(常说的基站):它为用户提供空中接口,负责管

    手机lte怎么设置|手机lte怎么设置5g

    手机lte怎么设置|手机lte怎么设置5g,,1. 手机lte怎么设置5g1、表示手机正在使用4G网络。LTE的全称是Long Term Evolution,是应用于手机及数