public struct Test { public double Val; public Test(double val = double.NaN) { Val = val; } public bool IsValid { get { return !double.IsNaN(Val); } } } Te
Because a struct can't have a user-defined parameterless constructor.
Test(double val = double.NaN) looks like one, but it's actually compiled as Test(double val) with some metadata about the default value.
Test(double val = double.NaN)
Test(double val)