采用对象初始值设定项时为什么使用(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
这是因为三元运算符需要返回类型相同。
在第一种情况下,"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
。编译器不会推断出存在一个从int
到int?
具有隐式强制转换运算符的类型。
理论上,它可能有足够的信息来计算它,但编译器需要更加复杂。
因为C#强制要求每个表达式都必须有一个类型。编译器无法确定非工作行中的三元表达式的类型。
? :
内联if运算符不知道返回哪种类型,因为两个参数是null
和int
。由于int
永远不能为null,因此编译器无法解析?:
返回的类型。