C # доступ к не статическому члену в статической функции - PullRequest
6 голосов
/ 07 июля 2011

Итак, у меня есть функция:

List<string> names = new string();

private static void getName(string name)
{
    names.add(name);
}

Когда я пытаюсь скомпилировать, я получаю: «Ссылка на объект требуется для нестатического поля». Что мне нужно сделать, чтобы этот элемент (имена) был совместим с getName?

Мне нужно, чтобы он был не статичным или преобразованным, потому что я хочу поместить результаты в другие нестатические функции и формы.

Ответы [ 5 ]

10 голосов
/ 07 июля 2011

Вам необходимо сообщить системе , какой список имен вас интересует. Это часть состояния объекта, экземпляр класса ... но какой? Возможно, вы создали несколько экземпляров класса - возможно, вы создали нет экземпляров класса. Статический метод не имеет никакой видимости этого - так какой экземпляр вы хотите, чтобы он извлек значение переменной names из?

Чтобы поместить это в другой пример, предположим, что у нас был такой класс:

public class Person
{
    public double MassInGrams { get; set; }
    public double HeightInMetres { get; set; }

    public static double ComputeBodyMassIndex()
    {
        // Which person are we interested in?
    }
}

Person p1 = new Person { MassInGrams = 76203, HeightInMetres = 1.8 };
Person p2 = new Person { MassInGrams = 65000, HeightInMetres = 1.7 };

double bmi = Person.ComputeBodyMassIndex();

Каким вы ожидаете получить результат? Вы попросили класс Person вычислить "ИМТ", но не сказали ему чей ИМТ для вычисления. Вы должны предоставить ему эту информацию.

Некоторые варианты для вашей ситуации:

  • Заменить names на статический вместо
  • Измените метод на метод экземпляра
  • Передача в экземпляр класса
  • Создать экземпляр класса, возможно, вернув его
  • Получить экземпляр класса другим способом

Кстати, это очень странное имя метода для чего-то, что добавляет имя. Это также несколько нетрадиционно ...

2 голосов
/ 07 июля 2011

Вам нужно сделать names статическим, если вы хотите использовать его из статического метода:

 // If this is static, you can use it from your static method
 static List<string> names = new List<string>();

Проблема в том, что getName определено для вашего типа , а не для экземпляра типа. Тем не менее, names определено, поэтому каждый экземпляр вашего типа получает свое собственное значение.

1 голос
/ 07 июля 2011

names - это объект, который будет существовать в экземплярах класса, например MyClass mc = new MyClass(); тогда вы можете получить доступ к mc.names. Статическое поле может быть вызвано без экземпляра класса только с именем класса, например MyClass.getName(""); будет работать. Поэтому, когда вы мыслите логически, класс не содержит имен, его содержат только «экземпляры этого класса». Следовательно, вы либо делаете этот список статичным, и он будет «одинаковым экземпляром списка» везде, когда вы вызываете MyClass.names, либо делаете метод getName нестатичным, и он будет вызываться только из экземпляров, поэтому MyClass.getName("") не будет было бы возможно, но mc.getName(""); Это вопрос того, что именно вы пытаетесь сделать.

0 голосов
/ 07 июля 2011

Вы не можете получить к нему доступ таким образом, вам нужно создать экземпляр класса, содержащего член.

0 голосов
/ 07 июля 2011

Статические методы не могут получить доступ к полям класса. Либо сделайте имена статическими, либо сделайте getName () нестатичными. Что вы подразумеваете под "Совместимость". Спросите себя ... метод должен быть статичным? Какова его цель и как вы собираетесь ее использовать?

...