Если я использую Делегаты, мне нужно, чтобы эти методы были статичными? - PullRequest
0 голосов
/ 19 октября 2011

У меня есть код C #, подобный этому:

using System;
delegate int anto(int x);
class Anto 
{
    static void Main()
    {
        anto a = square;
        int result = a(3);
        Console.WriteLine(result);
    }
    static int square(int x)
    {
        return x*x;
    }
}

какие выходы: 9. Ну, я новичок в C #, поэтому я начал играть с этим кодом, поэтому, когда я удаляю ключевое слово static из метода square, я получаю ошибку, подобную этой:

An object reference is required to access non-static member `Anto.square(int)'
Compilation failed: 1 error(s), 0 warnings

что вызывает эту ошибку? Так что, если я использую delegates, мне нужен метод static?

Я запускаю этот код здесь

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 19 октября 2011

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

var myAnto = new Anto();
anto a = myAnto.square;

Это не проверено и может не скомпилироваться в зависимости от уровня защиты Anto.square.

3 голосов
/ 19 октября 2011

Поскольку Main является статическим, оно может ссылаться только на другие статические элементы. Если вы удаляете static из square, он становится членом экземпляра, а в контексте static Main экземпляр какого-либо объекта отсутствует, поэтому члены экземпляра не являются «действительными».

К счастью, с делегатами не происходит ничего сумасшедшего, просто работает static - это указывает, что члены являются глобальными для типа, а не экземпляром этого типа.

2 голосов
/ 19 октября 2011

не нужно , чтобы быть статичным. Вы можете назначить нестатический метод делегату, но если он нестатический, вам нужно установить объект типа Anto:

Anto anto = new Anto();
anto a = anto.square;

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

0 голосов
/ 20 октября 2011

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

При необходимости можно записать следующим образом

anto a = (x)=>x*x ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...