我是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
}
}
答案 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;
}
}