EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: Convert.ToInt32(employeeNumberTextBox.Text),
我经常发现自己想做这样的事情(EmployeeNumber
是 Nullable<int>
,因为它是 LINQ-to-SQL dbml 对象的属性,其中列允许 NULL 值)。不幸的是,编译器认为
'null' 和 'int' 之间没有隐式转换
即使这两种类型在对它们自己的可为空的 int 的赋值操作中都是有效的。
据我所知,使用空合并运算符不是一个选项,因为如果它不为空,则需要在 .Text
字符串上进行内联转换。
据我所知,这样做的唯一方法是使用 if 语句和/或分两步分配它。在这种特殊情况下,我发现这非常令人沮丧,因为我想使用对象初始化器语法,而这个赋值将在初始化块中......
有谁知道更优雅的解决方案?
EmployeeNumber
属性的类型是 int?
,编译器会推断出类型,但如果分配给更通用的类型(如 object
)或新的声明的 var
变量。
出现问题是因为条件运算符不查看如何使用值(在这种情况下分配)来确定表达式的类型 - 只是真/假值。在这种情况下,您有一个 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),
我认为一种实用方法可以帮助使这个更清洁。
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);
虽然 Alex 为您的问题提供了正确和最接近的答案,但我更喜欢使用 TryParse
:
int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
? (int?)value
: null;
它更安全,并且可以处理无效输入的情况以及您的空字符串情况。否则,如果用户输入类似 1b
的内容,他们将看到一个错误页面,其中包含在 Convert.ToInt32(string)
中导致的未处理异常。
您可以转换 Convert 的输出:
EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: (int?)Convert.ToInt32(employeeNumberTextBox.Text)
//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;
编辑:上面的简要说明,我试图在变量 X1
中获取 Posid
的值(如果它的非空 int
并且值大于 0)。我必须在 Posid.Value
上使用 (int?)
才能使条件运算符不引发任何编译错误。仅供参考 GetHolidayCount
是一种 WCF
方法,可以给出 null
或任何数字。希望有帮助
从 C# 9.0 开始,这将最终成为可能:
目标打字??和?:有时是有条件的??和 ?: 表达式在分支之间没有明显的共享类型。这种情况今天失败了,但是如果有两个分支都转换为的目标类型,C# 9.0 将允许它们:Person person = student ??顾客; // 共享基类型 int?结果 = b? 0:空; // 可空值类型
这意味着问题中的代码块也将无错误地编译。
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: Convert.ToInt32(employeeNumberTextBox.Text),
new int?()
。default(int?)
。