C# 6 安全导航在 VS2015 预览版中不起作用

本文关键字:不起作用 VS2015 安全 导航 | 更新日期: 2023-09-27 18:35:24

我的代码中有以下属性

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?)

我做错了什么还是现在不可用?

C# 6 安全导航在 VS2015 预览版中不起作用

parent?.X的类型是 float? ,您将其添加到float - 导致另一个float?。这不能隐式转换为float

虽然尤瓦尔的答案应该有效,但我个人会使用这样的东西:

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

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

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

foo.X = foo.X;

。如果 parent 为非 null 且具有非零X值,则不会是无操作。

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

您可以改为执行以下操作:

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

如果返回 null,这将使用 null 合并运算符作为回退parent