方法之外的数组长度

时间:2014-03-05 11:37:27

标签: c# arrays unity3d initialization field

如果这是一个重复的问题,我道歉;

我可以找出数组中元素的数量:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{

    string[] myThings = new string[] {"Banana", "Dinosaur", "Gwen Stefani"};
    // int l = myThings.Length; // FAIL!

    // Use this for initialization
    void Start ()
    {
        ProcessThings();
    }

    void ProcessThings ()
    {
        //int l = myThings.Length;
        print("Things: " + l);
    }

}

我的问题是为什么我不能在方法之外声明l = myThings.Length(第9行)?  字段初始值设定项不能引用非静态字段,方法或属性“Test.myThings”

对我轻松,我正在学习:)

从蜡笔上升到C#

4 个答案:

答案 0 :(得分:2)

通常不允许这样做,因为编译器可能会重新排列变量,并且无法保证字段myThings在其长度分配给l之前将被初始化。

作为替代方法,您可以在构造函数中初始化字段l。

答案 1 :(得分:1)

来自C#规范的解释。

10.5.5.2实例字段初始化

  

实例字段的变量初始值设定项无法引用正在创建的实例。从而   在变量初始值设定项中引用它是一个编译时错误,因为它是一个编译时   变量初始值设定项通过简单名称引用任何实例成员的错误。   在示例中

class A
{
    int x = 1;
    int y = x + 1; // Error: reference to instance member of this
}
  

y的变量初始值设定项导致编译时错误,因为它引用了一个成员   正在创建的实例。

答案 2 :(得分:0)

  

“您无法使用实例变量初始化另一个实例   变量。为什么?因为编译器可以重新排列这些 - 没有   保证提醒将在defaultReminder之前初始化,所以   上面的行可能会抛出NullReferenceException。“

请参阅此链接:A field initializer cannot reference the nonstatic field, method, or property

(顺便说一句,为此,请在您的类型之前添加static

答案 3 :(得分:0)

您假设字符串数组“mythings”在整数成员变量之前初始化,方法是尝试使用字符串数组中的属性来初始化整数。

无法保证初始化顺序。所以你不能做任何依赖于初始化顺序的事情。