获取C#结构的地址是否会导致默认的构造函数调用?
例如,我有这样的结构:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct HEADER {
public byte OPCODE;
public byte LENGTH;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct S {
public HEADER Header;
public int Value;
}
Run Code Online (Sandbox Code Playgroud)
然后,当然,我不能这样做:
S s; // no constructor call, so...
var v = s.Value; // compiler error: use of possibly unassigned field 'Value'
Run Code Online (Sandbox Code Playgroud)
但是一旦我获得了结构的指针,我甚至可以在不使用指针的情况下读取它的字段,甚至是嵌入式结构域的字段:
S s;
S* ps = &s;
var v1 = ps->Value; // OK, expected
var v2 = s.Value; // OK!
var len = s.Header.LENGTH; // OK!
Run Code Online (Sandbox Code Playgroud)
那么,它是否以某种方式调用默认构造函数,或者 …
我正在使用Visual Studion 2017版本15.5.2和C#版本7.2.要点:
Color c = default; // or: c = default(Color); no difference
Debug.Print($"{c.Equals(default(Color))}"); // true
Debug.Print($"{c.Equals(default)}"); // false WHY?!
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用ValueTuple:
(string s, int i) t = default;
Debug.Print($"{t.Equals(default((string, int)))}"); // true
Debug.Print($"{t.Equals(default)}"); // true
Run Code Online (Sandbox Code Playgroud)
它应该是这样的吗?