为什么在采用对象初始化器时使用(int?)null?

时间:2011-07-01 18:04:27

标签: c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class User
    {
        public int? Age { get; set; }
        public int? ID { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            user.Age = null;        // no warning or error
            user.ID  = (int?)null;  // no warning or error

            string result = string.Empty;
            User user2 = new User
                             {
                Age = string.IsNullOrEmpty(result) ? null : Int32.Parse(result),
                // Error    1   Type of conditional expression cannot be determined 
                // because there is no implicit conversion between '<null>' and 'int'   
                // ConsoleApplication1\ConsoleApplication1\Program.cs   23  71  ConsoleApplication1

                ID = string.IsNullOrEmpty(result) ? (int?)null : Int32.Parse(result) // // no warning or error
                             };
        }
    }
}

问题:

为什么以下行不起作用?

Age = string.IsNullOrEmpty(result) ? null : Int32.Parse(result)

//更正一个

Age = string.IsNullOrEmpty(result) ? (int?) null : Int32.Parse(result)

为什么以下行有效?

user.Age = null;        // no warning or error

4 个答案:

答案 0 :(得分:6)

因为三元运算符需要返回类型是相同的类型。

在第一种情况下,“null”可以是任何引用类型的null(不仅仅是int?),因此要使其显式需要转换。

否则你可能有

string x = null;
Age = string.IsNullOrEmpty(result) ? x: Int32.Parse(result)

这显然有点傻瓜。

答案 1 :(得分:3)

Age = string.IsNullOrEmpty(result) ? null : Int32.Parse(result)

不起作用,因为string.IsNullOrEmpty(result) ? null : Int32.Parse(result)Age =部分分开评估。

编译器无法确定string.IsNullOrEmpty(result) ? null : Int32.Parse(result)应该是什么类型。

它首先看到null表示它是引用类型,并且它看到int这是一个似乎不兼容的值类型。存在一个带有从intint?的隐式转换运算符的类型的事实不是由编译器推断的。

理论上它可以有足够的信息来解决它,但编译器需要更加复杂。

答案 2 :(得分:2)

因为C#强制每个表达式都必须有一个类型。编译器无法确定非工作行中三元表达式的类型。

答案 3 :(得分:2)

? :内联if运算符不知道要返回哪个类型,因为这两个参数是nullint。由于int不能为空,因此编译器无法解析?:返回的类型。