簡體   English   中英

由於調用GetType()的StackOverflowException,進程正在終止

[英]Process is terminating due to StackOverflowException on calling GetType()

當我忘記使用靜態修飾符並將其簡化為可復制的代碼段時,我無意間遇到了這個問題。 運行時,以下將失敗並顯示StackOverflowException:

namespace test
{
    class Program
    {
        Program program = new Program();

        public static void Main(string[] args)
        { 
            var p = new Program();
            System.Console.WriteLine(p.GetType());
        }
    }
}

為什么會失敗? 是錯誤還是我對CLR的誤解?

令人討厭的行不是p.GetType() ,而是Program的類型初始值設定項。

創建程序實例時, var p = new Program(); 它運行Program的初始化Program來設置新實例。 這包括運行對Program字段的所有分配。

此初始化字段是罪魁禍首:

Program program = new Program();

要創建Program的實例,必須通過創建Program的新實例來初始化現場program 這將導致無限的初始化程序堆棧,並生成您的StackOverflowException

我認為它將遞歸地嘗試創建新的Program()對象,直到由於行而導致堆棧溢出:

class Program
{
    Program program = new Program();

您創建一個程序,然后創建一個程序,然后創建一個程序...等到無窮大。

我不確定您需要在這里完成什么,但是如果您需要在同一類中創建一個類的實例,那么我會假設您最終需要打一個基本案例才能停止遞歸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM