奇怪的StackOverflow异常

时间:2019-03-17 09:26:05

标签: c# type-conversion

我有以下代码:

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; }
}

在最后一行({ return 10; })处引发StackOverflow异常。而且我不知道为什么,因为堆栈上应该有足够的空间容纳所有东西。

我正在学习operator关键字和隐式/显式转换,因此我举了这个小例子来测试一些细微之处。

2 个答案:

答案 0 :(得分:8)

此方法无限调用自身会导致堆栈溢出:

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

为什么此方法会无限调用自身?好的,此方法定义了从intProgram的隐式转换,因此,假设给定的Program被称为int,则应该返回asd的实例。但是,您返回一个int。通常,这会失败,但是由于您定义了从intProgram的隐式转换,因此编译器会“很好,就可以了”。

但是在运行时,它会通过再次调用隐式转换方法来尝试将10转换为Program,。隐式转换方法返回一个10,运行时会尝试再次将其隐式转换为Program,因此它将再次调用该方法...

我真的看不到您要在这里做什么,所以我不知道该问题的解决方案。

答案 1 :(得分:3)

如果定义隐式运算符,则它应返回您指定的类型,在这种情况下,它应为Program类型。

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

这里发生的是您返回一个整数。通常,这根本不会编译,因为您应该返回一个Program。但是,由于您已经定义了从intProgram的隐式对象,所以这没问题;在运行时,此转换将用于将您的int转换为Program

但是,此转换不会返回Program,而是返回int,因此将再次调用该转换。

执行(Program)3时,这会导致调用(Program)10,这会导致(Program)10被调用,这是一个无限循环。

问一下自己实际要做什么,以及为什么答应返回Program时为什么要返回整数。