2009-09-12 58 views
20

如果我有这样的为什么T为0时Nullable <T>不是有效的自定义属性参数?

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出现时没有更新?

+1

虽然我最初碰到这个在.net 3.5 VS2008它还是来了在VS2010 Beta1中不起作用。 – 2009-09-12 21:43:38

回答

26

饿了吗?等于可空<饥饿>,这方面意味着

[Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)] 

等于

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

既然你只能使用指定的属性参数的恒定值,你将不得不求助于摆振的解决方案。

+0

现在你解释它了这是显而易见的!谢谢 – 2009-09-13 06:48:56

19

为了解决这个问题在你的属性创建另一个初始化:

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 } 
} 

我明白,你不打算使用这两个属性。

+0

问题不是“我该怎么做”,问题是“为什么”。这绝不会回答原因。 – 2009-09-12 21:27:09

+0

是的。这样可行。我知道如何解决这个问题,但我很困惑它为什么不能用作命名参数。这对我来说似乎不一致。 – 2009-09-12 21:29:26

+0

我应该删除这个答案吗?不幸的是,我不知道为什么部分没有答案:( – Shimmy 2009-09-12 21:32:56

5

属性可能只有参数基元,typeof表达式和数组创建表达式。

可空是一个结构。

因此它不允许那里。

我怀疑程序集文件格式本身不允许在存储属性值的地方存储类似结构的复杂类型。

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

1

您可以为该枚举创建默认值,而不是创建可为空的枚举。从第1个值枚举挑默认情况下,这样设置你的枚举这样

public enum Hungry 
{ 
    None, 
    Somewhat, 
    Very, 
    CouldEatMySocks 
} 
在你的代码

,你可以这样做是为了检查空

if(default(Hungry) == HungerLevel)//no value has been set 
相关问题