采用对象初始值设定项时为什么使用(int?)null

本文关键字:为什么 int null 对象 | 更新日期: 2023-09-27 18:00:49

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

采用对象初始值设定项时为什么使用(int?)null

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

在第一种情况下,"null"可以是任何引用类型的null(而不仅仅是int?(,因此为了使其向编译器显式,需要强制转换。

否则你可能会有

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

这显然有点像杜鹃花。

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?具有隐式强制转换运算符的类型。

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

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

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

相关文章: