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
答案 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
这是一个似乎不兼容的值类型。存在一个带有从int
到int?
的隐式转换运算符的类型的事实不是由编译器推断的。
理论上它可以有足够的信息来解决它,但编译器需要更加复杂。
答案 2 :(得分:2)
因为C#强制每个表达式都必须有一个类型。编译器无法确定非工作行中三元表达式的类型。
答案 3 :(得分:2)
? :
内联if运算符不知道要返回哪个类型,因为这两个参数是null
和int
。由于int
不能为空,因此编译器无法解析?:
返回的类型。