当T为什么时,为什么Nullable 不是有效的自定义属性参数?

如果我有这样的枚举

public enum Hungry { Somewhat, Very, CouldEatMySocks } 

和这样的自定义属性

 public class HungerAttribute : Attribute { public Hungry HungerLevel { get; set; } public Hungry? NullableHungerLevel { get; set; } } 

我可以做这个

 [Hunger(HungerLevel = Hungry.CouldEatMySocks)] public class Thing1 

但我不能这样做

 [Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)] public class Thing2 

它会生成一个错误,指出“’NullableHungerLevel’不是有效的命名属性参数,因为它不是有效的属性参数类型”。

为什么不允许这样做? 据我所知,从根本上说它不在被接受的类型列表中。 有效类型似乎是基元,枚举,字符串,类型和前面类型的一维数组。

当Nullable出现时,这只是一个没有更新的旧规则吗?

饥饿? 等于Nullable ,就其而言

 [Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)] 

等于

 [Hunger(NullableHungerLevel = new Nullable(Hungry.CouldEatMySocks))] 

由于您只能在命名属性参数中使用常量值,因此您必须使用Shimmy的解决方案。

要解决此问题,请在属性中创建另一个初始值设定项:

 class Program { [Hunger()] static void Main(string[] args) { } public sealed class HungerAttribute : Attribute { private readonly Hungry? _HungerLevel; public Hungry? HungerLevel { get { return _HungerLevel; } } public bool IsNull { get { return !_HungerLevel.HasValue; } } public HungerAttribute() { } //Or: public HungerAttribute(Hungry level) { _HungerLevel = level; } } public enum Hungry { Somewhat, Very, CouldEatMySocks } } 

我知道你不会同时使用这两个属性。

属性可以仅具有参数基元,类型表达式和数组创建表达式。

Nullable是一个结构。

因此不允许那里。

我怀疑汇编文件格式本身不允许在存储属性值的位置存储复杂类型,如结构。

我不知道有任何改变它的计划。 但我无法解释为什么存在这种限制。

您可以为该枚举创建默认值,而不是创建可为空的枚举。 枚举从第一个值中选择默认值,因此请设置这样的枚举

 public enum Hungry { None, Somewhat, Very, CouldEatMySocks } 

在您的代码中,您可以执行此操作以检查null

 if(default(Hungry) == HungerLevel)//no value has been set