【问题标题】:X cannot be declared in this scope + X cannot be used before it's declaredX 不能在此范围内声明 + X 不能在声明之前使用
【发布时间】:2022-12-18 23:19:33
【问题描述】:

我正在关注 Microsoft tutorial 使用 Azure Spatial Anchors 创建一个新的 HoloLens Unity 应用程序并且给定的代码有一些错误。

错误
'distance' cannot be declared in this scope because that name is used in an enclosing local scope 是第一个遇到的错误。我试图通过在distance前面评论float来解决它,但后来我得到了Cannot use local variable 'distance' before it is declared + Cannot infer the type of implicitly-typed deconstruction variable 'distance'.

private bool IsAnchorNearby(Vector3 position, out GameObject anchorGameObject)
{
    anchorGameObject = null;

    if (_foundOrCreatedAnchorGameObjects.Count <= 0)
    {
        return false;
    }

    //Iterate over existing anchor gameobjects to find the nearest
    var (distance, closestObject) = _foundOrCreatedAnchorGameObjects.Aggregate(
        new Tuple<float, GameObject>(Mathf.Infinity, null),
        (minPair, gameobject) =>
        {
            Vector3 gameObjectPosition = gameobject.transform.position;
            float distance = (position - gameObjectPosition).magnitude;
            return distance < minPair.Item1 ? new Tuple<float, GameObject>(distance, gameobject) : minPair;
        });

    if (distance <= 0.15f)
    {
        //Found an anchor within 15cm
        anchorGameObject = closestObject;
        return true;
    }
    else
    {
        return false;
    }
}

本教程的代码有什么问题?

【问题讨论】:

  • 在 lambda 表达式 ((minPair, gameobject) =&gt; {...}) 中为 distance 使用另一个名称:float d = ...; return d;。 lambda 表达式就像IsAnchorNearby 方法中的另一个方法。

标签: c# unity3d


【解决方案1】:

t看起来错误是由在Aggregate方法中的lambda表达式内外使用变量名distance引起的。在 lambda 表达式中,距离变量被声明为局部变量,这意味着它不能在 lambda 表达式之外使用。

修复此错误的一种方法是将 lambda 表达式中的距离变量重命名为其他名称,如下所示:

var (distance, closestObject) = _foundOrCreatedAnchorGameObjects.Aggregate(
    new Tuple<float, GameObject>(Mathf.Infinity, null),
    (minPair, gameobject) =>
    {
        Vector3 gameObjectPosition = gameobject.transform.position;
        float dist = (position - gameObjectPosition).magnitude;
        return dist < minPair.Item1 ? new Tuple<float, GameObject>(dist, gameobject) : minPair;
    });

或者,您可以删除 lambda 表达式中距离变量的声明,如下所示:

var (distance, closestObject) = _foundOrCreatedAnchorGameObjects.Aggregate(
    new Tuple<float, GameObject>(Mathf.Infinity, null),
    (minPair, gameobject) =>
    {
        Vector3 gameObjectPosition = gameobject.transform.position;
        return (position - gameObjectPosition).magnitude < minPair.Item1 ? 
               new Tuple<float, GameObject>((position - gameObjectPosition).magnitude, gameobject) : minPair;
    });

在这种情况下,distance 变量将被赋予 position 和 gameObjectPosition 之间的距离值,而不是被声明为局部变量。

【讨论】:

  • 它解决了错误,非常欢迎您的解释!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多