无法使用实例引用访问C#静态成员

时间:2018-09-21 23:41:08

标签: c# static

首先,请先通读问题,然后再得出结论Member '<method>' cannot be accessed with an instance reference的重复。

现在,我的问题有所不同,因为我的静态成员是另一个类:

using System;

public class Automobile
{
    public static int NumberOfWheels = 4;
    public static int SizeOfGasTank
    {
        get
        {
            return 15;
        }
    }
    public static void Drive() { Console.WriteLine("Driving"); }
    // public static event bool RunOutOfGas;

    // Other non-static fields and properties...
}

class SimpleClass
{
    // Static variable that must be initialized at run time. 
    static readonly long baseline;
    public static Automobile A1;

    // Static constructor is called at most one time, before any 
    // instance constructor is invoked or member is accessed. 
    static SimpleClass()
    {
        baseline = DateTime.Now.Ticks;
        A1 = new Automobile();
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Automobile");

        Automobile.Drive();
        Console.WriteLine(Automobile.NumberOfWheels);

        Console.WriteLine("SimpleClass");
        Console.WriteLine(SimpleClass.A1.NumberOfWheels);
        Console.WriteLine(SimpleClass.Automobile.NumberOfWheels);

    }
}

SimpleClass.A1.NumberOfWheelsSimpleClass.Automobile.NumberOfWheels(甚至是SimpleClass.NumberOfWheels)都会给我错误。

如何访问A1.NumberOfWheels下的SimpleClass

结论:因此,如果您使用静态类而不是C#简单类型,则无法在根类({{}下访问其静态成员(A1.NumberOfWheels)。 1}}),但受C#静态成员访问规则的限制。我问这个问题是因为我认为这是一个明显的设计缺陷,但是没有人解决这个特定问题并迅速在地毯下滑动。

  

可能更大的问题是:您到底想做什么?

@RufusL,很好的问题。我对静态变量或其目的的理解是,在其所有类对象之间共享一个真点。使用一个非常简单的示例对其进行说明,假设我有一堆单位数字乘法器对象,这些对象负责计算两个单位数字的倍数。最快的方法不是每次都计算它,而是在它们的静态变量中存储一个二维的一位数字多表,因此不需要真正的倍数,只需要查找即可。这将大大提高性能。
现在,

  • 这样的静态变量只能是C#预定义的简单类型,而不能是我自己定义的类型,这没有任何意义。
  • 一个类中的此类静态变量只能深一层,而不能深一层,这在任何意义上都没有多大意义。

2 个答案:

答案 0 :(得分:1)

SimpleClass.A1.NumberOfWheels给您一个错误,因为A1是一个实例,并且您试图通过实例访问静态字段。

SimpleClass.Automobile.NumberOfWheels会给您一个错误,因为Automobil中没有公共静态成员声明为SimpleClass

访问NumberOfWheels的唯一方法是Automobile.NumberOfWheels

答案 1 :(得分:0)

A1可能是SimpleClass的静态成员,但是该静态成员仍然是对Automobile类型的特定实例的引用。如果您需要访问A1.NumberOfWheels,则也许NumberOfWheels属性应该不是静态的。