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

时间:2012-04-04 11:37:57

标签: c#

   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值,那么任何人都可以向我解释为什么会发生错误。

6 个答案:

答案 0 :(得分:8)

条件运算符的结果必须是可以隐式转换为相同类型的相同类型。

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

如果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总是失败(更改索引器并且会改变)。