试图理解为什么这个执行溢出
Trying to understand why this execution overflows
我想 know/learn 更详细地了解为什么 this 抛出堆栈溢出错误的机制? (.Net Fiddle link)
(与 DisplayType 在接口和抽象中都存在有关 class,重命名后者使其工作。我想了解导致此溢出的执行路径是什么) .
using System;
using System.IO;
public class Program
{
public static void Main()
{
Console.WriteLine("--------BEGIN--------");
FIVan van = new FIVan();
van.DisplayType();
Console.WriteLine("---------END---------");
}
}
public interface IVan
{
public Type TheType {get;}
public void DisplayType() => Console.WriteLine("Generic Type associated with this IVan<T> is : " + TheType.ToString());
}
public abstract class AVan<T> : IVan
where T : class
{
public Type TheType { get => typeof(T);}
// NOTE : renaming DisplayType to something else (like Display()) doesn't Stack Overflow, it works.
public void DisplayType() => ((IVan)this).DisplayType();
}
public class FIVan : AVan<FileInfo>
{
}
编辑:
实际上我并没有完全意识到默认接口实现是如何工作的。我添加此编辑是为了向您指出 this 我发现它很有趣的文章。
AVan<T>.DisplayType()
覆盖 IVan.DisplayType()
指定的默认接口实现。所以它只是无限期地递归调用自己。
如果重命名 AVan<T>.DisplayType
,它会改为调用默认接口实现,因此不会导致堆栈溢出。
我想 know/learn 更详细地了解为什么 this 抛出堆栈溢出错误的机制? (.Net Fiddle link)
(与 DisplayType 在接口和抽象中都存在有关 class,重命名后者使其工作。我想了解导致此溢出的执行路径是什么) .
using System;
using System.IO;
public class Program
{
public static void Main()
{
Console.WriteLine("--------BEGIN--------");
FIVan van = new FIVan();
van.DisplayType();
Console.WriteLine("---------END---------");
}
}
public interface IVan
{
public Type TheType {get;}
public void DisplayType() => Console.WriteLine("Generic Type associated with this IVan<T> is : " + TheType.ToString());
}
public abstract class AVan<T> : IVan
where T : class
{
public Type TheType { get => typeof(T);}
// NOTE : renaming DisplayType to something else (like Display()) doesn't Stack Overflow, it works.
public void DisplayType() => ((IVan)this).DisplayType();
}
public class FIVan : AVan<FileInfo>
{
}
编辑: 实际上我并没有完全意识到默认接口实现是如何工作的。我添加此编辑是为了向您指出 this 我发现它很有趣的文章。
AVan<T>.DisplayType()
覆盖 IVan.DisplayType()
指定的默认接口实现。所以它只是无限期地递归调用自己。
如果重命名 AVan<T>.DisplayType
,它会改为调用默认接口实现,因此不会导致堆栈溢出。