2010-09-15 18 views
3

可能重复:
Type result with Ternary operator in C#下的财产#返回值可以为空

我碰到了这种情况,并且似乎没有要回一个自然的方式可空的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

我这样做,当我觉得答案引脚指出我的问题。虽然我经常问不好但含糊不清的答案。 – Haoest 2010-09-15 19:37:34

回答

10
public int? userId 
{ 
    get 
    { 
     int rv; 
     return int.TryParse(userIdString, out rv) ? (int?)rv : null; 
    } 
} 
+0

+1输入速度比我快! :P – 2010-09-15 19:20:14

+0

但显然,有人不喜欢这个答案---我得到了投票(但看起来他也打了你) – 2010-09-15 19:24:09

+0

是的......我刚刚学会了忽略倒票巨魔.. – 2010-09-15 19:27:37

1

您在同一个表达式中返回(不可为空)int或null。你需要在你的三元表达式中明确地返回一个int?以便工作。

4
public int? userId 
{ 
    get 
    { 
     int rv; 
     return int.TryParse(userIdString, out rv) ? (int?)rv : null; 
    } 
} 
3

编辑:我没有仔细读过这个问题;问题不在于条件运算符不喜欢空值 - 而是它需要知道表达式的整体类型应该是什么......并且该类型必须是的类型左侧,右侧。 null本身是一个可以转换为多种类型的无类型表达式; int是一个完全有效的类型,但它是其中null不能将转换成的类型之一。您可以将右侧明确地指定为int?,并从左侧获得intint?的隐式转换,您可以在左侧执行转换,并获得隐式转换,您可以从左侧执行nullint?

我的回答是喜欢詹姆斯的,但铸造空来代替:

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>(); 

我不认为我真的很喜欢,但我提供它为你的检查: )

+0

我喜欢这里的深入方法......问题是:编译器或开发人员是否将null转换为'int?'? – 2010-09-15 19:58:06

+0

@ md5sum:两者...没有它,编译器将不知道整体条件表达式使用哪种类型。 – 2010-09-15 20:01:39

+0

@ md5sum,当给出'布尔? int:null',编译器不会跳跃说* *都可以转换为'int?'。它会让其中一个跳跃,并说'int'可以是'int?'或'null'可以是'int?',但是你需要在编译器的大脑中放置'int?'建议,这样说。 – 2010-09-15 20:14:09