【发布时间】:2015-01-27 12:01:21
【问题描述】:
我把结构布局弄得一团糟,我发现了一些我觉得很奇怪的东西:
下面的代码按我想的那样工作:
using System;
using System.Runtime.InteropServices;
public class Program
{
[STAThread]
static void Main()
{
Magic m = new Magic
{
InstanceA = new ClassA(),
InstanceB = new ClassB {Value="47"}
};
Console.WriteLine(m.InstanceA.Value);
Console.ReadKey();
}
class ClassA
{
public dynamic Value;
}
class ClassB
{
public string Value; // Change to int and it will get messy
}
[StructLayout(LayoutKind.Explicit)]
struct Magic
{
[FieldOffset(0)]
public ClassA InstanceA;
[FieldOffset(0)]
public ClassB InstanceB;
}
}
但是,如果您将 classB.Value 更改为 int,此代码将抛出上述 FatalExecutionEngineError。
谁能解释一下为什么或者如何解决?我知道这可能太复杂了,我只是在这里乱七八糟,但有人可能想要一些挑战。
【问题讨论】:
-
那是真的坏事反正;覆盖参考是...... gah。为什么不只拥有一个
object字段和两个转换该字段的属性?还有...可变结构、公共字段等;p -
只有在清楚知道自己在做什么的情况下才应该使用显式布局。它专为非托管互操作场景而设计,而不仅仅是“乱搞”。见stackoverflow.com/q/23323696/517852。
-
那么什么是为搞乱而设计的? ^^...我明白你在说什么。
标签: c# dynamic structlayout