C#中的可空类型是什么?

C#中的可空类型是什么?,c#,C#,当我为上述属性分配空值时,出现语法错误 int? _fileControlNo = null; public int? FileControlNo { get { return _fileControlNo; } set { _fileControlNo = value; } } 如果我能够使用Nullable类型在valuetype对象中设置null值,请任何人向我解释为什么会发生错误 条件运算符的结果需要具有相同的类型,或者可以相

当我为上述属性分配空值时,出现语法错误

   int? _fileControlNo = null;
   public int? FileControlNo
    {
        get { return _fileControlNo; }
        set { _fileControlNo = value; }
    }

如果我能够使用Nullable类型在valuetype对象中设置null值,请任何人向我解释为什么会发生错误

条件运算符的结果需要具有相同的类型,或者可以相互隐式转换的类型

在您的情况下,您有一个
null
和一个
Int32
——这违反了该要求


如果您返回一个可为null的
Int32
,而不是
Int32
,则
null
可以隐式转换为该类型,您的代码将工作(或者,将
null
转换为
int?
)。

null
转换为
int?

objDPRUtils.FileControlNo =sArrElements.Value(3)==null ? null : Convert.ToInt32(sArrElements.Value(3));

尝试像这样直接分配:

objDPRUtils.FileControlNo =sArrElements.Value(3)==null ? (int?) null : Convert.ToInt32(sArrElements.Value(3));

可空类型正是他们所说的:也可以存储空值的简单值类型。
我建议您根本不需要最后一行代码。你应该能够逃脱:

objDPRUtils.FileControlNo =sArrElements.Value(3);
如果您真的想在null情况下分配另一个值,请使用null合并运算符

objDPRUtils.FileControlNo =sArrElements.Value(3);

在这种情况下,如果右侧为null,则会将值0分配给
FileControlNo

您的代码混合类型null和Int32不能在这种情况下混合。它们必须是同一类型的

如果使用
int.TryParse
并仅尝试在成功时设置值,则将获得相同的结果,并且可以在字段上使用
HasValue
来确定其是否为null,这通常是使用可为null类型的方式

愚蠢的例子

objDPRUtils.FileControlNo =sArrElements.Value(3)??0;

您会注意到,在这种情况下,
HasValue
的测试中的代码永远不会执行,因为无法设置fileControlNo,因为tryParse总是失败(更改索引器,这将改变)。

条件运算符需要返回相同类型的结果,在您的情况下,
null

这应该行得通

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; }
    } 

}

确切的错误消息是什么?错误是什么,关联是什么?我猜错误消息是无法确定条件表达式的类型,因为“”和“int”之间没有隐式转换。
sArrElements.Value(3)==null ? (int?)null : Convert.ToInt32(sArrElements.Value(3));