Я думаю, что это ошибка компилятора.
Следующее консольное приложение компилируется и выполняется безупречно при компиляции с 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-03-29
Я открыл билет здесь: http://github.com/dotnet/roslyn/issues/10126
ОБНОВЛЕНИЕ 2016-04-06
Здесь был открыт новый билет: https://github.com/dotnet/coreclr/issues/4049