Je pense que c'est un bug du compilateur.
L'application de console suivante compile et exécute parfaitement lorsqu'il est compilé avec 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();
}
}
}
Mais maintenant, il se fait bizarre: Ce code compile, mais il jette à un TypeLoadException
lors de l'exécution.
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var x = MyStruct.Empty;
}
public struct MyStruct
{
public static readonly MyStruct? Empty = null;
}
}
}
Avez-vous rencontrez le même problème? Si oui, je vais déposer un problème à Microsoft.
Le code est absurde, mais je l'utiliser pour améliorer la lisibilité et à atteindre la désambiguïsation.
J'ai méthodes différentes surcharges comme
void DoSomething(MyStruct? arg1, string arg2)
void DoSomething(string arg1, string arg2)
L'appel d'une méthode de cette façon...
myInstance.DoSomething(null, "Hello world!")
... ne compile pas.
L'appel
myInstance.DoSomething(default(MyStruct?), "Hello world!")
ou
myInstance.DoSomething((MyStruct?)null, "Hello world!")
fonctionne, mais semble laid. Je préfère de cette façon:
myInstance.DoSomething(MyStruct.Empty, "Hello world!")
Si je mets de la Empty
variable dans une autre classe, tout fonctionne bien:
public static class MyUtility
{
public static readonly MyStruct? Empty = null;
}
Comportement étrange, n'est-ce pas?
Mise à JOUR 2016-03-29
J'ai ouvert un ticket ici: http://github.com/dotnet/roslyn/issues/10126
Mise à JOUR 2016-04-06
Un nouveau ticket a été ouvert ici: https://github.com/dotnet/coreclr/issues/4049