【发布时间】:2016-03-25 14:43:50
【问题描述】:
我认为这是一个编译器错误。
以下控制台应用程序在使用 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();
}
}
}
但现在变得很奇怪:这段代码可以编译,但在执行时会抛出 TypeLoadException。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var x = MyStruct.Empty;
}
public struct MyStruct
{
public static readonly MyStruct? Empty = null;
}
}
}
您是否遇到过同样的问题?如果是这样,我将向 Microsoft 提出问题。
代码看起来毫无意义,但我用它来提高可读性和消除歧义。
我有不同重载的方法,比如
void DoSomething(MyStruct? arg1, string arg2)
void DoSomething(string arg1, string arg2)
以这种方式调用方法...
myInstance.DoSomething(null, "Hello world!")
... 无法编译。
打电话
myInstance.DoSomething(default(MyStruct?), "Hello world!")
或
myInstance.DoSomething((MyStruct?)null, "Hello world!")
有效,但看起来很难看。我更喜欢这种方式:
myInstance.DoSomething(MyStruct.Empty, "Hello world!")
如果我将Empty 变量放入另一个类,一切正常:
public static class MyUtility
{
public static readonly MyStruct? Empty = null;
}
奇怪的行为,不是吗?
2016 年 3 月 29 日更新
我在这里开票:http://github.com/dotnet/roslyn/issues/10126
2016 年 4 月 6 日更新
【问题讨论】:
-
可以是reproduced with .NET fiddle,乍一看像个bug。注意:请删除您的
using指令,示例不需要它们,这会不必要地使您的代码示例混乱。 -
就我个人而言,我称之为
MyStruct.Null。在结构的上下文中考虑“空”时,人们会期待一些不同的东西。 -
我认为它可能是一个允许编译的错误。 VS2013 编译时出现同样的错误,异常
CS0523: Struct member 'ConsoleApplication1.Program.MyStruct.Empty' of type 'System.Nullable<ConsoleApplication1.Program.MyStruct>' causes a cycle in the struct layout,我有一半的预期 -
不错的发现。那肯定看起来像一个错误。
-
首先,是否是错误取决于 C# 团队,我不再是该团队的成员。其次,用户“coderealm”对bug的分析是无稽之谈;我怀疑那里的 coderealm 和这里的 Julius 是同一个人。点运算符不是调用运算符,它是成员访问运算符。 调用仅在访问的成员是属性、被调用的方法或被调用的委托类型的字段时才会发生。 (或其他一些类似的情况。)在这种情况下,以上都不是真的;这里没有调用。
标签: c# visual-studio-2015 roslyn compiler-bug coreclr