我认为这是一个编译器错误.
使用VS 2015编译时,以下控制台应用程序编译并执行完美:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var x = MyStruct.Empty;
}
public struct MyStruct
{
public static readonly MyStruct Empty = new MyStruct();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是现在它变得很奇怪了:这个代码编译,但它会TypeLoadException在执行时抛出.
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var x = MyStruct.Empty;
}
public struct MyStruct
{
public static readonly MyStruct? Empty = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你遇到同样的问题吗?如果是这样,我将在Microsoft提出问题.
代码看起来毫无意义,但我用它来提高可读性并实现消歧.
我有不同的重载方法,如
void DoSomething(MyStruct? arg1, string arg2)
void DoSomething(string arg1, string arg2) …
public struct MyStruct {
static MyStruct? myProperty;
}
Run Code Online (Sandbox Code Playgroud)
试图编译这将给我错误:
Struct member 'myStruct.myProperty' causes a cycle in the struct layout.
从我收集的内容来看,这个错误通常发生在一个struct 的实例包含它自己的struct作为属性时(这对我来说很有意义).
但在这里,它是一个静态属性,所以我不知道这样的递归是如何发生的.另外,只有在声明Nullable结构时才会发生错误,声明静态非可空是安全的.
究竟发生了什么会导致一个循环?
编辑:
我确实发现了我认为是重复的问题; 它解释了为什么当实例具有自己类型的成员时发生递归,但这是关于静态成员的.我从经验中知道struct可以拥有自己类型的静态成员,这些成员在运行时不会中断,这个特定的代码似乎只是因为静态成员是Nullable而中断.
其次,多个人马上告诉我代码为他们编译; 似曾相识,我正在使用的c#的"版本"是针对Unity的,所以我认为这是他们的编译器的另一个错误,我将向他们提出这个问题.
@Evk指出这实际上是一个常见问题:https:
//github.com/dotnet/roslyn/issues/10126
是否可以创建一个不是结构但是值类型的类,或者像一个值类型,因为它在传递时复制而不是通过引用传递.
编辑:
很抱歉在被问到后需要编辑的问题.
另外,请参阅此问题以获取更多信息. 在不存在的结构布局中循环
c#中的结构是否有固定的大小?那就是为什么以下代码:
struct Person
{
Person child;
}
Run Code Online (Sandbox Code Playgroud)
会造成无限循环问题吗?或者因为结构类型包含其正确的值而不是引用?
例如,说我想做一个遗传学模拟器,我有这个非常简单的结构
public struct person{
string name;
int age;
string hairColor;
person father;
person mother;
}
Run Code Online (Sandbox Code Playgroud)
这样以后我就可以用Joey.father.haircolor引用这个人Joey父母的头发颜色了吗?我不断收到错误消息:
Struct Member 'person.father' of type 'person' causes a cycle in the struct layout
Run Code Online (Sandbox Code Playgroud)
我是上课的唯一选择吗?为了提高速度,我宁愿使用结构,因为它是所有数据,但是如果没有其他选择,我显然可以使用类。