Странное исключение StackOverflow - PullRequest
2 голосов
/ 17 марта 2019

У меня есть следующий код:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine((Program)3);

        Console.WriteLine("Execution complete.");
        Console.Read();
    }

    public static implicit operator Program(int asd)
    { return 10; }
}

, который вызывает исключение StackOverflow в последней строке ({ return 10; }).И я не могу понять, почему, так как в стеке должно быть достаточно места для всего.

Я изучаю ключевое слово operator и неявное / явное преобразование, поэтому я сделал этот небольшой пример, чтобы протестировать некоторые вещи.

Ответы [ 2 ]

8 голосов
/ 17 марта 2019

Переполнение стека вызвано бесконечным вызовом этого метода:

public static implicit operator Program(int asd)
{ return 10; }

Почему этот метод вызывает себя бесконечно? Ну, этот метод определяет неявное преобразование из int в Program, поэтому вы должны вернуть экземпляр Program с int с именем asd. Тем не менее, вы возвращаете int. Обычно это не сработает, но поскольку вы определили неявное преобразование из int в Program, компилятор работает «хорошо, все в порядке».

Но во время выполнения он пытается преобразовать ваш 10 в Program, , снова вызвав метод неявного преобразования . Метод неявного преобразования возвращает 10, который среда выполнения пытается снова неявно преобразовать в Program, поэтому он вызывает метод снова ...

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

3 голосов
/ 17 марта 2019

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

public static implicit operator Program(int asd)
{ return 10; }

Здесь происходит то, что вы возвращаете целое число. Обычно это просто не компилируется, потому что вы должны вернуть Program. Однако, поскольку вы определили неявное значение от int до Program, это не проблема; во время выполнения это преобразование будет использовано для приведения вашего int в Program.

Однако это преобразование не возвращает Program, а int, поэтому преобразование вызывается снова.

При выполнении (Program)3 это вызывает (Program)10, что вызывает (Program)10, что ... это бесконечный цикл.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...