Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这些方法无限递归?_C#_Recursion_Methods_Void - Fatal编程技术网

C# 为什么这些方法无限递归?

C# 为什么这些方法无限递归?,c#,recursion,methods,void,C#,Recursion,Methods,Void,我一直在开发一个创建有理数的程序,当我调用其中任何一个方法时,我都会从递归中得到堆栈溢出 public Rational(){ new Rational(0,1); } public Rational(int n){ new Rational(n,1); } public Rational(int numerator, int denominator){ new Rational(numerator,denominator); } 有人能给我解释一下为什么这

我一直在开发一个创建有理数的程序,当我调用其中任何一个方法时,我都会从递归中得到堆栈溢出

public Rational(){
      new Rational(0,1);
}
public Rational(int n){
      new Rational(n,1);
}
public Rational(int numerator, int denominator){
      new Rational(numerator,denominator);
}

有人能给我解释一下为什么这些方法会无限递归吗?

这些不仅仅是任何方法,它们是构造函数,用递归的方式调用它们几乎肯定不是你想要的。当你调用第一个构造函数时,它会创建两个新对象(
this
加上构造函数主体中的新Rational,它调用另一个,它调用另一个…)

回答您的问题:当第三个构造函数运行时,它会调用自身。没有结束递归的基本情况,因此它将递归到堆栈溢出

public Rational(int numerator, int denominator){
      new Rational(numerator,denominator);
}
此构造函数使用给定的参数调用自身。除非我遗漏了什么(C#不是我非常熟悉的语言),否则你永远不会退出函数,你只会不断产生更多&more
Rational
s。您的构造函数应该看起来像

public Rational(){
    numerator = 0;
    denominator = 1;
}
public Rational(int n){
    numerator = n;
    denominator = 1;
}
public Rational(int n, int d){
    numerator = n;
    denominator = d;
}

new
将创建一个新实例,它将不会继续初始化当前对象。因此,您有一个递归调用,其中构造函数创建一个新实例,这将创建一个新实例等

我想你要找的是:

名称空间控制台App18
{
公共阶级理性
{
//A
public Rational():这(0,1)//调用C
{
}
//B
public-Rational(int-n):这个(n,1)//调用C
{
}
//C
公共有理数(整数分子,整数分母)
{
//在这里初始化
}
}
}
也可以像这样链接:

名称空间控制台App18
{
公共阶级理性
{
//A
public Rational():此(0)//调用B
{
}
//B
public-Rational(int-n):这个(n,1)//调用C
{
}
//C
公共有理数(整数分子,整数分母)
{
//在这里初始化
}
}
}

因为你的构造函数试图创建一个新对象,然后再创建另一个对象,这……首先没有数学。你不想要分子/分母吗?你什么时候停?你正在调用新的有理数(分子,分母);一次又一次。而且这绝对不是你委托构造函数调用的方式,你是从哪里学会这样编写构造函数的?我认为如果前两个构造函数链接到第三个构造函数会更好。。。