使用Nullable <value>类型的条件运算符赋值?

Gra*_*ank 58 c# nullable conditional-operator

EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : Convert.ToInt32(employeeNumberTextBox.Text),
Run Code Online (Sandbox Code Playgroud)

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

由于内联转换需要在.Text字符串上发生(如果它不为空),因此Null合并运算符不是我能看到的选项.

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

谁知道更优雅的解决方案?

Ale*_*man 66

出现此问题的原因是条件运算符不查看值的使用方式(在本例中为赋值)以确定表达式的类型 - 只是true/false值.在这种情况下,你有一个null和一个Int32,并且无法确定类型(有真正的原因它不能只假设Nullable <Int32>).

如果你真的想以这种方式使用它,你必须自己将其中一个值转换为Nullable <Int32>,因此C#可以解析类型:

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? (int?)null
    : Convert.ToInt32(employeeNumberTextBox.Text),
Run Code Online (Sandbox Code Playgroud)

要么

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : (int?)Convert.ToInt32(employeeNumberTextBox.Text),
Run Code Online (Sandbox Code Playgroud)

  • 你说有真正的原因它不能假设Nullable <Int32>.什么原因? (7认同)
  • 你也可以写`new int?()`. (5认同)
  • @SLaks或`default(int?)`. (2认同)

Ner*_*ury 8

我认为实用方法可以帮助使这个更清洁.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);
Run Code Online (Sandbox Code Playgroud)


小智 6

虽然Alex为您的问题提供了正确和近端的答案,但我更喜欢使用TryParse:

int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
    ? (int?)value
    : null;
Run Code Online (Sandbox Code Playgroud)

它更安全,并处理无效输入的情况以及空字符串方案.否则,如果用户输入的内容类似1b,则会显示错误页面,其中包含未处理的异常Convert.ToInt32(string).