使用C#中的新内部类初始化构造函数

时间:2014-07-23 15:09:50

标签: c# unity3d

我是C#编程的新手。我想知道为什么这是不可能的:

// In file1.cs
public class Test {

   public int Rt() {
      return 10;
   }
}

//在file2.cs中

public class Test2 {
   // initialize constructor here, but return compile-error
   Test k = new Test();

   static void Main() {
    Console.Write(k.Rt());  // error here
   }
}

附加:我正在学习C#的统一性,所以我也想知道上面是不可能的,为什么这不是一个错误的统一

public class PlayerScript: MonoBehaviour {
  public Vector2 speed = new Vector2(25, 25);   // Not an error

  void Update() {
    Debug.Log(speed);   // works
  }
}

3 个答案:

答案 0 :(得分:1)

这是因为您的Main方法是静态的,但您的Test2类不是静态的。 k变量存在于Test2的实例中,但Main方法属于该类型本身。如果某些东西是静态的,这意味着你可以在不实例化该类型的变量的情况下调用它:

Test2.Main();

如果您尝试实例化Test2并致电Main,那么您会收到错误,因为它是静态的。

var test2 = new Test2();
test2.Main(); //ERROR

你可以使k静态以便编译:

public class Test2 {
   // initialize constructor here, but return compile-error
   static Test k = new Test();

   static void Main() {
       Console.Write(k.Rt());  // error here
   }
}

您展示的第二个示例工作正常,因为Update方法静态,这意味着该方法的实例化为PlayerScript,与{{1}不同}} 方法。

答案 1 :(得分:1)

您正在尝试访问静态方法中的实例成员。这是不允许的。您可以将k定义为静态以使其正常工作

static Test k = new Test();

我建议您查看Static Classes and Static Class Members以获取更多详细信息

  

即使没有创建类的实例,静态成员也可以在类上调用。静态成员始终由类名访问,而不是实例名。无论创建了多少个类实例,都只存在一个静态成员的副本。静态方法和属性无法访问其包含类型中的非静态字段和事件,并且除非在方法参数中显式传递,否则它们无法访问任何对象的实例变量。

答案 2 :(得分:1)

除了其他答案,另一个选项是让您的Test类和Rt方法保持静态。像这样:

public class Program
{
    public static void Main()
    {
        Console.Write(Test.Rt()); 
    }
}

public static class Test {

   public static int Rt() {
      return 10;
   }
}

尽管确实存在静态类,但实际上并没有很多情况。我只想在Test t = new Test();方法中移动Main

public class Program
{
    public static void Main()
    {
        Test t = new Test();
        Console.Write(t.Rt()); 
    }
}

public class Test {

   public int Rt() {
      return 10;
   }
}