繁体   English   中英

奇怪的StackOverflow异常

[英]Strange StackOverflow exception

我有以下代码:

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关键字和隐式/显式转换,所以我做了一个小例子来测试一些tings。

堆栈溢出是由此方法无限地调用自身引起的:

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

为什么这个方法无限地调用自己? 好吧,这个方法定义了从intProgram的隐式转换,因此你应该在给定一个名为asdint的情况下返回一个Program实例。 但是,您返回一个int 通常情况下,这会失败,但由于您定义了从intProgram的隐式转换,编译器会“好的,没关系”。

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

我真的不明白你在这里想做什么,所以我不知道这个问题的解决方案是什么。

如果定义了一个隐式运算符,它应该返回你指定的类型,在这种情况下它应该是Program类型。

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

这里发生的是你返回一个整数。 通常情况下,这不会编译,因为您应该返回一个Program 但是,既然已经定义了从intProgram的隐式,那么这没有问题; 运行时此转换将用于将您的int转换为Program

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

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

问问自己你实际上想要做什么,以及当你答应返回一个Program时为什么要返回一个整数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM