C# 为什么我的函数不能访问它所在类中的私有变量?

C# 为什么我的函数不能访问它所在类中的私有变量?,c#,unity3d,private,C#,Unity3d,Private,编辑:我对空错误表示什么并不感到困惑,我知道我的列表是空的。我只是不确定为什么在这种情况下它会是空的,或者为什么将我的列表设置为public会突然解决这个问题 因此,我试图创建一个函数,如果它满足条件,它将向列表中添加一个对象。函数接受它正在检查的标记,以及它将添加到的特定列表(如果可能)。我之所以这样做,是因为我有两个列表,我宁愿两个都只需要一个函数 这一切都很好,但我遇到了一个问题,除非列表设置为公共,否则它似乎真的不起作用?如果我能帮上忙,我宁愿不去做。 我不明白为什么,因为它可以很好地处

编辑:我对空错误表示什么并不感到困惑,我知道我的列表是空的。我只是不确定为什么在这种情况下它会是空的,或者为什么将我的列表设置为public会突然解决这个问题

因此,我试图创建一个函数,如果它满足条件,它将向列表中添加一个对象。函数接受它正在检查的标记,以及它将添加到的特定列表(如果可能)。我之所以这样做,是因为我有两个列表,我宁愿两个都只需要一个函数

这一切都很好,但我遇到了一个问题,除非列表设置为公共,否则它似乎真的不起作用?如果我能帮上忙,我宁愿不去做。 我不明白为什么,因为它可以很好地处理私有的gameObject引用,并且在同一个位置声明,并且函数在同一个类中,但是在列表是私有的情况下尝试调用这个函数只会给我一个空对象引用错误,在这种情况下,我已经缩小到列表为空,不是目标

这其实没什么大不了的,因为我可以改变一些事情来避免列表公开,但我真的很困惑为什么会发生这种情况?我已经尝试过显式地通过ref传递,但这也带来了同样的问题

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ClickHandler : MonoBehaviour
{
    GameObject clickedMob = null;

    List<GameObject> selectedMinions;
    List<GameObject> selectedHostiles;

    void Update ( )
    {

        if ( Input.GetButtonDown("Click"))
        {
            switch (clickState)
            {
                case NextClickAction.Nothing:
                    { }
                    break;

                case NextClickAction.TargetFriendly:
                    {

                       hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

                        if ( hit )
                        {
                            if ( hit.transform != null )
                            {
                                clickedMob = hit.transform.gameObject;
                                CheckObject("Minion", selectedMinions);
                            }
                        }
                    }
                    break;

                case NextClickAction.TargetHostile:
                    {
                        hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

                        if ( hit )
                        {
                            if ( hit.transform != null )
                            {
                                clickedMob = hit.transform.gameObject;
                                CheckObject("Hostile", selectedHostiles);
                            }
                        }
                    }
                    break;

                default:
                    {
                        Debug.Log("why do you have an enum this big");
                        DeactivateClick();
                        Debug.LogError("Enum set outside of index. Returned to 0.");
                        break;
                    }
            }

        }
    }   //  end of update

    private void CheckObject ( string tag , List<GameObject> mobList)
    {
        if ( clickedMob.CompareTag(tag) )
        {
            if ( clickedMob.GetComponent<Animator>() != null )
            {
                ClickedMobAnimator = clickedMob.GetComponent<Animator>();

                switch (ClickedMobAnimator.GetBool("Selected"))
                {
                    case true:
                        ClickedMobAnimator.SetBool("Selected", false); // Setting the object to have a little box around it when it's selected.

                        mobList.Remove(clickedMob);
                        Debug.Log(mobList.Count + " " + clickedMob);
                        break;

                    case false:
                        ClickedMobAnimator.SetBool("Selected", true);
                        mobList.Add(clickedMob); 
                        Debug.Log(mobList.Count + " " + clickedMob);
                        break;
                }
            }

        }
    }

我知道这个对象不是空的,因为我有一个调试日志来打印这个对象。它就在那里。

因为您的列表是非公开的,而且也是非序列化的字段,所以您不能从inspector中分配它们来自动创建新的列表实例,所以在ClickHandler脚本中添加唤醒方法,将它们实例化为新的列表对象

void Awake() {
    selectedMinions = new List<GameObject>();
    selectedHostiles = new List<GameObject>();
}
或者你可以在申报时做同样的事情

List<GameObject> selectedMinions = new List<GameObject>();
List<GameObject> selectedHostiles = new List<GameObject>();

您需要实际创建一个新列表,否则默认值保持为空。Unity会自动为编辑器的公共成员变量创建它。这是否回答了您的问题@不完全是。要么这样,要么我看得不对。我的问题不是它是空的,而是更具体地说,为什么当列表是私有的时它才是空的。据我所知,这不会有什么区别,因为所有的东西都在同一个类中,对吗?@UnholySheep First off,您好,绵羊同胞们!:我不太清楚你说的是什么意思?比如,在函数中创建一个临时列表,然后返回它,或者其他什么?@unhylysheep噢,天哪,我完全忘记了那一步!我知道这很简单,非常感谢你!现在修好了^^我决定选择后者,这对我很有效。我有点不好意思忘记了这一步,但很高兴这次我不用花一个下午的时间自己去想办法。非常感谢。
List<GameObject> selectedMinions = new List<GameObject>();
List<GameObject> selectedHostiles = new List<GameObject>();