【发布时间】:2020-09-03 07:38:09
【问题描述】:
我有以下代码。
class Program
{
static void Main(string[] args)
{
Enterprise.Initialize("Awesome Company");
// Assertion failed when constructor of 'Reg' class is disabled.
Debug.Assert(Reg.Root == @"Software\Awesome Company");
}
}
public static class Enterprise
{
// Static Properties.
public static string Company
{
get;
private set;
}
// Static Methods.
public static void Initialize(string company)
{
Company = company;
}
}
public class Reg
{
public static string Root = $@"Software\{Enterprise.Company}";
// ctor.
static Reg()
{
// Assertion failed when this constructor is disabled.
}
}
执行时,断言通过。但是,当 Reg 类的构造函数被禁用时,断言失败。仔细一看,我发现Reg 类的隐式构造函数是在Main() 之前调用的。如果Reg类的构造函数显式定义,则在Main()之后调用。
为什么隐式和显式构造函数之间存在这种差异?
【问题讨论】:
-
我无法重现此问题(VS2019,.Net Core 3.1)(我假设“禁用”您的意思是“注释掉”。)
-
“显式”和“隐式”构造函数是什么意思?你如何“禁用”一个?据我所知,这些术语不存在。
-
对我来说,当这个构造函数被禁用时,这个断言不会失败。
-
@HimBromBeere 我在
Reg的静态字段和Main()的开头放置了一个断点。未定义构造函数时,首先在静态字段的断点处执行中断。从堆栈跟踪中,它显示执行来自(隐式)构造函数。 -
哎呀,这不好。将向该页面添加一些反馈。
标签: c# .net-framework-version c#-7.3