【发布时间】:2015-01-24 13:45:36
【问题描述】:
public struct Test
{
public double Val;
public Test(double val = double.NaN) { Val = val; }
public bool IsValid { get { return !double.IsNaN(Val); } }
}
Test myTest = new Test();
bool valid = myTest.IsValid;
上面给出了valid==true,因为没有调用具有默认 arg 的构造函数,并且对象是使用标准默认值 val = 0.0 创建的。
如果结构是一个类,则行为是valid==false,这是我所期望的。
我发现这种行为差异,尤其是 struct 案例中的行为令人惊讶且不直观——这是怎么回事? stuct 构造上的默认 arg 有什么作用? 如果它没用,为什么要编译?
更新:为了澄清这里的重点不是行为是什么 - 而是为什么它会在没有警告的情况下编译并且行为不直观。即如果没有应用默认参数,因为在 new Test() 情况下没有调用构造函数,那么为什么要让它编译?
【问题讨论】:
-
我想说的是,如果不传递参数,那么您就是在将所有成员设置为其默认值的结构上调用 implicit default constructor,而不是调用您的构造函数
-
@DanielJ.G.是的,情况就是这样——但我的意思是,这是不直观的。它不是关于发生了什么,而是关于为什么它会在没有警告的情况下编译。
-
除了通过反射之外,您可以编写没有合理方式直接调用它们的方法/构造函数(不像这里您可以提供参数,并且默认值是“无意义的”)。 C# 编译器必须非常复杂(并且可能必须解决停止问题)才能防止您编译此类代码。你可能打算它只能通过反射使用,因为编译器都知道。
-
@Damien_The_Unbeliever 认为这种统一的行为可能是设计使然,这样您就可以通过反射使用默认参数……这在专业方面实际上是无穷大的,而且大象大小松散不利的一面。
-
不,我的意思是编译器不应该有您要求的极其复杂的机器来防止此代码编译。跨度>
标签: c# .net struct default-constructor default-arguments