Я думаю, что это ошибка компилятора.
Следующее консольное приложение компилируется и выполняется безупречно при компиляции с помощью 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!")
or
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
using
, они не нужны для примера и излишне загромождают ваш пример кода. - person Heinzi   schedule 25.03.2016MyStruct.Null
. Люди ожидают чего-то другого, говоря о пустом в контексте структур. - person Heinzi   schedule 25.03.2016CS0523: Struct member 'ConsoleApplication1.Program.MyStruct.Empty' of type 'System.Nullable<ConsoleApplication1.Program.MyStruct>' causes a cycle in the struct layout
, чего я бы наполовину ожидал - person Rhumborl   schedule 25.03.2016MyStruct.Empty
. Из-заdot operator
вызывается статическое поле типа MyStruct. Который вызываетnull
для типа. Позволит ли CLR вызывать null для типа? Когда вы вызываетеvar x = MyStruct.Empty;
в методеMain
, этоinvocation
, а не простоassignment
значения. Разрешит ли CLR этот вызов? - person Julius Depulla   schedule 30.03.2016dot operator
представляетinvocation
. Я не понимаю, как CLR может вызыватьnull
- person Julius Depulla   schedule 30.03.2016MyStruct.null
буквально. Использование оператора точки представляет собой вызов, а не простое присваивание, и обращение к CLR с просьбой вызвать нулевую ссылку, тип no, приведет к исключению TypeLoadException. - person Julius Depulla   schedule 30.03.2016