C#6安全导航无法在VS2015预览中使用

时间:2014-12-28 16:48:21

标签: c# roslyn c#-6.0

我的代码中有以下属性

public float X {
    get {
        if (parent != null)
            return parent.X + position.X;
        return position.X;
    }
    set { position.X = value; }
}

我希望将吸气剂转换为

的形式
    get {
        return parent?.X + position.X;
    }

但是我收到以下错误:Cannot implicitly convert type 'float?' to 'float'. An explicit conversion exists (are you missing a cast?)

我做错了什么或现在不能用?

2 个答案:

答案 0 :(得分:8)

parent?.X的类型为float?,您将float添加到float?,从而产生另一个float。这不能隐式转换为get { return (parent?.X ?? 0f) + position.X; }

虽然Yuval的答案应该有效,但我个人会使用类似的东西:

get
{
    return (parent?.X).GetValueOrDefault() + position.X;
}

foo.X = foo.X;

我不确定你的设计,请注意 - 你在吸气器中添加东西而不是在设置器中添加东西的事实很奇怪。这意味着:

parent

...如果X非空且值为非{{1}},则不会是无操作。

答案 1 :(得分:0)

如果父项为null,则在您的情况下使用空传播运算符将尝试返回null。 只有float可以为空,才能实现这一点,因此float?

您可以改为:

get 
{
   return parent?.X + position.X ?? position.x;
}

如果parent返回null,这将使用null-coalescing运算符作为回退。