我有以下代码:
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
关键字和隐式/显式转换,因此我举了这个小例子来测试一些细微之处。
答案 0 :(得分:8)
此方法无限调用自身会导致堆栈溢出:
public static implicit operator Program(int asd)
{ return 10; }
为什么此方法会无限调用自身?好的,此方法定义了从int
到Program
的隐式转换,因此,假设给定的Program
被称为int
,则应该返回asd
的实例。但是,您返回一个int
。通常,这会失败,但是由于您定义了从int
到Program
的隐式转换,因此编译器会“很好,就可以了”。
但是在运行时,它会通过再次调用隐式转换方法来尝试将10
转换为Program
,。隐式转换方法返回一个10
,运行时会尝试再次将其隐式转换为Program
,因此它将再次调用该方法...
我真的看不到您要在这里做什么,所以我不知道该问题的解决方案。
答案 1 :(得分:3)
如果定义隐式运算符,则它应返回您指定的类型,在这种情况下,它应为Program
类型。
public static implicit operator Program(int asd)
{ return 10; }
这里发生的是您返回一个整数。通常,这根本不会编译,因为您应该返回一个Program
。但是,由于您已经定义了从int
到Program
的隐式对象,所以这没问题;在运行时,此转换将用于将您的int
转换为Program
。
但是,此转换不会返回Program
,而是返回int
,因此将再次调用该转换。
执行(Program)3
时,这会导致调用(Program)10
,这会导致(Program)10
被调用,这是一个无限循环。
问一下自己实际要做什么,以及为什么答应返回Program
时为什么要返回整数。