[英]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; }
为什么这个方法无限地调用自己? 好吧,这个方法定义了从int
到Program
的隐式转换,因此你应该在给定一个名为asd
的int
的情况下返回一个Program
实例。 但是,您返回一个int
。 通常情况下,这会失败,但由于您定义了从int
到Program
的隐式转换,编译器会“好的,没关系”。
但是在运行时,它会尝试通过再次调用隐式转换方法将您的10
转换为Program
。 隐式转换方法返回10
,运行时尝试再次隐式转换为Program
,因此它再次调用该方法...
我真的不明白你在这里想做什么,所以我不知道这个问题的解决方案是什么。
如果定义了一个隐式运算符,它应该返回你指定的类型,在这种情况下它应该是Program
类型。
public static implicit operator Program(int asd)
{ return 10; }
这里发生的是你返回一个整数。 通常情况下,这不会编译,因为您应该返回一个Program
。 但是,既然已经定义了从int
到Program
的隐式,那么这没有问题; 运行时此转换将用于将您的int
转换为Program
。
但是,此转换不返回Program
,而是返回int
,因此再次调用转换。
当执行(Program)3
,这将导致(Program)10
被调用,这会导致(Program)10
被调用,...这是一个无限循环。
问问自己你实际上想要做什么,以及当你答应返回一个Program
时为什么要返回一个整数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.