试图理解为什么这个执行会溢出

TRe*_*Rex 0 c# stack-overflow

我想了解/了解更详细的机制,为什么抛出堆栈溢出错误?(.Net Fiddle 链接)

(与 DisplayType 存在于接口和抽象类中这一事实有关,重命名后者使其工作。我想了解导致此溢出的执行路径是什么)。

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>
{
}
Run Code Online (Sandbox Code Playgroud)

编辑: 实际上我没有完全意识到默认接口实现是如何工作的。我添加此编辑是为了向您指出这篇我发现很有趣的文章。

And*_*ent 5

AVan<T>.DisplayType()覆盖指定的默认接口实现IVan.DisplayType()。所以它只是无限递归地调用自己。

如果AVan<T>.DisplayType重命名,它会调用默认接口实现,因此不会导致堆栈溢出。

  • 如果您从不希望接口的任何实现者重写此方法,我会推荐 IVan 上的扩展方法 - 它看起来完全相同,但无法被重写。 (2认同)