具有Nullable <value>类型的条件运算符赋值?</value>

时间:2008-09-16 19:01:28

标签: c# conditional-operator nullable

EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : Convert.ToInt32(employeeNumberTextBox.Text),

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

就我所看到的而言,无法合并运算符不是一个选项,因为如果它不是null,则需要在.Text字符串上进行内联转换。

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

任何人都知道更优雅的解决方案吗?

6 个答案:

答案 0 :(得分:65)

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

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

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? (int?)null
    : Convert.ToInt32(employeeNumberTextBox.Text),

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : (int?)Convert.ToInt32(employeeNumberTextBox.Text),

答案 1 :(得分: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);
    }
}

然后

EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);

答案 2 :(得分:6)

虽然Alex为您的问题提供了正确且近端的答案,但我更倾向于使用TryParse

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

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

答案 3 :(得分:3)

您可以转换Convert:

的输出
EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
   ? null
   : (int?)Convert.ToInt32(employeeNumberTextBox.Text)

答案 4 :(得分:1)

//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中得到int的值(如果它是非空的X1并且值大于0)。我不得不在(int?)上使用Posid.Value来使条件运算符不会抛出任何编译错误。 仅仅一个FYI GetHolidayCount是一种WCF方法,可以提供null或任意数字。 希望有所帮助

答案 5 :(得分:0)

C# 9.0开始,这将最终成为可能:

键入的目标?和?:

有时是有条件的?和?:表达式在分支之间没有明显的共享类型。这样的情况今天失败了,但是如果两个分支都将目标类型都转换为:C#9.0将允许它们。

Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type

这意味着问题中的代码块也将正确编译。

EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : Convert.ToInt32(employeeNumberTextBox.Text),