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

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

据我所知,空合并合并运算符不是一个选项,因为如果不为null,则需要在.Text字符串上进行内联转换。

据我所知,唯一的方法是使用if语句和/或分两步进行赋值。 在这种特殊情况下,我感到非常沮丧,因为我想使用对象初始值设定项语法,并且此分配将在初始化块中...

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

===============>>#1 票数:66 已采纳

发生问题是因为条件运算符不会查看如何使用值(在这种情况下为赋值)来确定表达式的类型-只是true / false值。 在这种情况下,您有一个null和一个Int32 ,并且无法确定类型(确实有理由不能仅假设Nullable <Int32> )。

如果您确实想以这种方式使用它,则必须自己将值之一强制转换Nullable <Int32> ,以便C#可以解析该类型:

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

要么

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

===============>>#2 票数: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);

===============>>#3 票数:6

尽管Alex为您的问题提供了正确的,最接近的答案,但我更喜欢使用TryParse

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

这样比较安全,可以处理无效输入的情况以及空字符串情况。 否则,如果用户输入类似1b ,则会向他们显示错误页面,并带有在Convert.ToInt32(string)引起的未处理的异常。

===============>>#4 票数:3

您可以转换Convert的输出:

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

===============>>#5 票数: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有和值大于0)varibale X1 我必须在Posid.Value上使用(int?)才能使条件运算符不Posid.Value任何编译错误。 FYI GetHolidayCount只是WCF方法,可以提供null或任何数字。 希望能有所帮助

  ask by Grank translate from so

未解决问题?本站智能推荐:

5回复

Nullable类型问题?:条件运算符

有人可以解释为什么这在C#.NET 2.0中有效: ......但这不是: 后一种形式给我一个编译错误“无法确定条件表达式的类型,因为'<null>'和'System.DateTime'之间没有隐式转换。” 并不是说我不能使用前者,但第二种风格与我的其余代码更加
4回复

是否可以使用条件运算符为可空值赋值?

我知道我可以这样做: 但为什么我不能这样做呢? 有没有办法使用条件运算符为可空值赋值?
6回复

在C#中使用条件运算符键入结果

我正在尝试使用条件运算符,但我正在挂起它认为结果应该是的类型。 下面是一个我设法表明我遇到的问题的例子: 在上面指出的行上,我得到以下编译错误: 无法确定条件表达式的类型,因为'<null>'和'System.DateTime'之间没有隐式转换 我很困惑因为
2回复

为什么以下条件运算符在包含Nullable类型的StringBuilder中奇怪地工作? 在C#?

我无法理解为什么上面的代码(从实际代码中修改)总是给我奇怪的结果:“ZXCV”而不是“Tom(ZXCV)”。 有没有人知道背后的原因,如果可能的话可以提供参考?
5回复

在.Net中使用条件运算符的奇怪行为

这让我非常难过。 也许我现在太累了。 inputArea是一个可以为null的Rectangle,在我的特定情况下为null。 前两个语句将cropArea初始化为0.然而,第二个语句根据图像宽度和高度生成正确的cropArea。 我是否误解了条件运算符的任何内容? 当inp
6回复

为什么条件运算符没有正确地允许使用“null”来赋值为可空类型? [重复]

可能重复: 可空类型和三元运算符。 为什么这不起作用? 具有可空<value>类型的条件运算符赋值? 这将无法编译,说明“无法确定条件表达式的类型,因为'System.DateTime'和''”之间没有隐式转换 这很好用
6回复

在C#中,为什么条件运算符不能隐式转换为可空类型

我很好奇为什么隐式强制转换失败... 以及为什么我必须执行显式强制转换 在我看来,编译器具有做出隐式强制转换决策所需的所有信息,不是吗?
1回复

有日期时间的条件运算符? 不会编译[重复]

这个问题已经在这里有了答案: ?的可空类型问题:条件运算符 5个答案 谁能告诉我为什么它不能编译? 我以为在写入可为空的对象( DateTime? )时,可以使用null。 相反,我得到这个错误: 错误19无法确定条件表达式的类型,因为'Syst
9回复

可空类型和三元运算符:为什么? 10:禁止使用null? [重复]

这个问题已经在这里有了答案 : 具有Nullable <value>类型的条件运算符分配? (5个答案) 为什么此C#代码无法编译?
5回复

如何使用Nullable Int的条件运算

一个小问题。 任何想法的人为什么这不起作用? 如果左手表达式为True,我试图返回null ,否则返回1 。 看似简单,但给出了编译错误。 无法确定条件表达式的类型,因为null和int之间没有隐式转换。 如果我替换null ? null : 1 ? null : 1有