代码之家  ›  专栏  ›  技术社区  ›  Haoest

C#可为null的属性的返回值[重复]

  •  3
  • Haoest  · 技术社区  · 14 年前

    可能重复:
    Type result with Ternary operator in C#

    我遇到了这种情况,似乎没有一种自然的方法返回可为null的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;
        }
    }
    

    编辑:有没有更自然的方法来实例化一个可以为null的对象,从而使三元运算符工作?

    4 回复  |  直到 8 年前
        1
  •  10
  •   James Curran    14 年前
    public int? userId 
    { 
        get 
        { 
            int rv; 
            return int.TryParse(userIdString, out rv) ? (int?)rv : null; 
        } 
    } 
    
        2
  •  4
  •   Nathan Wheeler    14 年前
    public int? userId
    {
        get
        {
            int rv;
            return int.TryParse(userIdString, out rv) ? (int?)rv : null;
        }
    }
    
        3
  •  3
  •   Jon Skeet    14 年前

    EDIT:我没有仔细阅读这个问题;问题不是条件运算符不喜欢空值-而是它需要知道表达式的整体类型应该是什么。。。这种类型必须是 左手边, 右手边。 null 它本身是一个无类型的表达式,可以转换成多种类型; int 无效的 不能 int? 并得到 内景 从左边看, 您可以在左侧执行强制转换,并获得 无效的 内景? .

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

    这是为了强调 一个空引用;它是一个类型为空的值 内景? . 此时,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>(); 
    

        4
  •  1
  •   Bob    14 年前

    在同一个表达式中返回一个(不可为null的)int或null。您需要显式返回 int?