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

我经常发现自己想做这样的事情(因为它EmployeeNumberNullable<int>LINQ-to-SQL dbml 对象的属性,其中列允许 NULL 值)。不幸的是,编译器认为

'null' 和 'int' 之间没有隐式转换

即使这两种类型在对它们自己的可为空的 int 的赋值操作中都是有效的。

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

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

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

4

6 回答 6

77

出现问题是因为条件运算符不查看如何使用值(在这种情况下分配)来确定表达式的类型 - 只是真/假值。在这种情况下,您有 anull和 an 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),
于 2008-09-16T19:08:05.970 回答
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);
于 2008-09-16T19:20:49.920 回答
6

虽然亚历克斯为您的问题提供了正确和最接近的答案,但我更喜欢使用TryParse

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

它更安全,并且可以处理无效输入的情况以及您的空字符串情况。否则,如果用户输入类似的内容,1b他们将看到一个错误页面,其中包含Convert.ToInt32(string).

于 2008-09-16T19:32:47.410 回答
3

您可以转换 Convert 的输出:

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
   ? null
   : (int?)Convert.ToInt32(employeeNumberTextBox.Text)
于 2008-09-16T19:05:30.080 回答
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;

编辑:上面的简要说明,我试图在 varibale 中获取Posid(如果其非空int且值大于 0)的值X1。我不得不使用(int?)onPosid.Value来让条件运算符不抛出任何编译错误。仅供参考GetHolidayCount是一种WCF可以给出null或任何数字的方法。希望有帮助

于 2015-04-24T15:31:30.957 回答
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),
于 2020-07-04T10:22:33.540 回答