C#可以为空的属性的返回值

时间:2010-09-15 19:15:08

标签: c# nullable

  

可能重复:
  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;
    }
}
编辑:有没有更自然的实例化可空的方法,使三元运算符工作?

4 个答案:

答案 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?的右侧,并从左侧隐式转换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>(); 

我认为我不是那么喜欢,但我提供给你检查:)

答案 3 :(得分:1)

你在同一个表达式中返回一个(不可为空)int或null。您需要在三元表达式中显式返回int?才能使其生效。