-1
   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 类型在 valuetype 对象中设置 null 值,任何人都可以向我解释为什么会发生错误。

4

6 回答 6

8

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

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

Int32如果您返回 nullable而不是 an Int32,则null可以隐式转换为这种类型,并且您的代码将起作用(或者,将 the 强制转换null为 an int?)。

于 2012-04-04T11:41:00.203 回答
2

投到null_int?

objDPRUtils.FileControlNo =sArrElements.Value(3)==null ? (int?) null : Convert.ToInt32(sArrElements.Value(3));
于 2012-04-04T11:41:36.417 回答
1

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

这应该工作

sArrElements.Value(3)==null ? (int?)null : Convert.ToInt32(sArrElements.Value(3));
于 2012-04-04T11:44:38.830 回答
0

尝试像这样直接分配:

objDPRUtils.FileControlNo =sArrElements.Value(3);
于 2012-04-04T11:42:34.007 回答
0

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

objDPRUtils.FileControlNo =sArrElements.Value(3);

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

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

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

于 2012-04-04T11:43:45.127 回答
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 总是失败(更改索引器并且会更改)。

于 2012-04-04T11:44:20.727 回答