int? _fileControlNo = null;
public int? FileControlNo
{
get { return _fileControlNo; }
set { _fileControlNo = value; }
}
当我将null值分配给上述属性时,我收到语法错误。
objDPRUtils.FileControlNo =sArrElements.Value(3)==null ? null : Convert.ToInt32(sArrElements.Value(3));
如果我能够使用Nullable Type在valuetype对象中设置null值,那么任何人都可以向我解释为什么会发生错误。
答案 0 :(得分:8)
条件运算符的结果必须是可以隐式转换为相同类型的相同类型。
在您的情况下,您有null
和Int32
- 这些违反了该要求。
如果Int32
代替Int32
而返回可以为空的null
,则null
可以隐式转换为此类型,并且您的代码可以正常工作(或者转换为int?
到{{1}})。
答案 1 :(得分:2)
将null
投向int?
objDPRUtils.FileControlNo =sArrElements.Value(3)==null ? (int?) null : Convert.ToInt32(sArrElements.Value(3));
答案 2 :(得分:1)
条件运算符需要返回相同类型的结果,在您的情况下,null
不可能
这应该有效
sArrElements.Value(3)==null ? (int?)null : Convert.ToInt32(sArrElements.Value(3));
答案 3 :(得分:0)
尝试直接分配:
objDPRUtils.FileControlNo =sArrElements.Value(3);
答案 4 :(得分:0)
Nullable类型正是他们所说的:简单的值类型,也可以存储空值 我建议您根本不需要最后一行代码。你应该能够逃脱:
objDPRUtils.FileControlNo =sArrElements.Value(3);
如果你真的想在null的情况下分配另一个值,请使用null合并运算符??
objDPRUtils.FileControlNo =sArrElements.Value(3)??0;
在这种情况下,如果右侧为空,则将值0赋值给FileControlNo
。
答案 5 :(得分:0)
您的代码混合类型为null,Int32无法在此实例中混合使用。它们必须属于同一类型。
如果你使用int.TryParse
并且只尝试设置成功的值,你将获得相同的结果,并且可以在字段上使用HasValue
来确定它是否为空,哪个是可空类型通常使用
愚蠢的例子
class Program
{
private static int? _fileControlNo;
static void Main(string[] args)
{
string[] sArrElements = new string[] { "1", "2", "3", null };
int result;
if (int.TryParse(sArrElements[3], out result))
{
FileControlNo = result;
}
if (_fileControlNo.HasValue)
{
// do something here
}
}
public static int? FileControlNo
{
get { return _fileControlNo; }
set { _fileControlNo = value; }
}
}
你会注意到在这种情况下你的HasValue
测试中的代码永远不会执行,因为无法设置_fileControlNo,因为tryParse总是失败(更改索引器并且会改变)。