我遇到了这种情况,似乎没有一种自然的方式来返回一个可以为空的int。下面的代码给出了编译错误,因为三元运算符不喜欢null。
public int? userId
{
get
{
int rv;
return int.TryParse(userIdString, out rv) ? rv : null;
}
}
所以你(或者只是我)真的必须一路走下去拼出一切:
public int? userId
{
get
{
int id;
if(int.TryParse(userIdString, out id)){
return id;
}
return null;
}
}
编辑:有没有更自然的实例化可空的方法,使三元运算符工作?
答案 0 :(得分:10)
public int? userId
{
get
{
int rv;
return int.TryParse(userIdString, out rv) ? (int?)rv : null;
}
}
答案 1 :(得分:4)
public int? userId
{
get
{
int rv;
return int.TryParse(userIdString, out rv) ? (int?)rv : null;
}
}
答案 2 :(得分:3)
null
本身是一个无类型表达式,可以转换为多种类型; int
是完全有效的类型,但它是null
无法转换为的类型之一。您可以明确显示类型int?
的右侧,并从左侧隐式转换int
到int?
,或您可以在左侧执行强制转换,并获得null
到int?
的隐式转换。
我的答案就像詹姆斯一样,但是反而投了空:
public int? userId
{
get
{
int rv;
return int.TryParse(userIdString, out rv) ? rv : (int?) null;
}
}
这是为了强调它是不一个空引用;它是int?
类型的空值。那时,int rv
的转换是显而易见的。
除此之外还有两个其他选择:
return int.TryParse(userIdString, out rv) ? rv : new int?();
return int.TryParse(userIdString, out rv) ? rv : default(int?);
我个人认为“铸造空”是最好的形式,但你可以自己决定。
另一种选择是使用通用的静态方法:
public static class Null
{
public static T? For<T>() where T : struct
{
return default(T?);
}
}
并写:
return int.TryParse(userIdString, out rv) ? rv : Null.For<int>();
我认为我不是那么喜欢,但我提供给你检查:)
答案 3 :(得分:1)
你在同一个表达式中返回一个(不可为空)int或null。您需要在三元表达式中显式返回int?
才能使其生效。