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

本文关键字:类型 什么 | 更新日期: 2023-09-27 18:29:54

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

当我为上述属性分配空值时,我收到语法错误。

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

请,如果我能够使用 Nullable Type 在 valuetype 对象中设置 null 值,谁能向我解释为什么会发生错误。

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

条件运算符的结果需要是可以隐式相互转换的相同类型。

在您的情况下,您有nullInt32 - 这些都违反了该要求。

如果返回的不是Int32,而是返回可为空的Int32,则可以将null隐式转换为此类型,并且您的代码将起作用(或者,将null转换为int?(。

将你的null投射到int?

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

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

这应该有效

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

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

objDPRUtils.FileControlNo =sArrElements.Value(3);

如果您确实想在 null 的情况下分配另一个值,请使用 null 合并运算符 ??

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

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

尝试像这样直接分配:

objDPRUtils.FileControlNo =sArrElements.Value(3);

您的代码混合了 null 类型,并且 Int32 不能像这样混合在这种情况下。它们需要属于同一类型。

如果您使用int.TryParse并且只尝试在成功时设置值,您将获得相同的结果,并且可以在字段上使用HasValue来确定其是否为 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; }
    } 
}

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