Why is a Nullable<T> not a valid Custom Attribute Parameter when T is?

Hungry? is equal to Nullable<Hungry>, which in terms mean that

[Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)]

is equal to

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

Since you can only use constant values in named attribute arguments you will have to resort to Shimmy's solution.


To get around this create another initializer in your Attribute:

class Program
{
  [Hunger()]
  static void Main(string[] args)
  {
  }

  public sealed class HungerAttribute : Attribute
  {        
    public Hungry? HungerLevel { get; }
    public bool IsNull => !_HungerLevel.HasValue;

    public HungerAttribute()
    {
    }

    //Or:
    public HungerAttribute(Hungry level)
    {
      HungerLevel = level;
    }
  }

  public enum Hungry { Somewhat, Very, CouldEatMySocks }
}

I understand that you're not going to use both properties.


Attributes may have as only parameters primitives, typeof expressions and array-creation expression.

Nullable is a struct.

Therefore it is not allowed there.

I suspect the assembly file format itself doesn't allow storage of complex types like structs in the place where attribute values are stored.

I don't know of any plans to change that. But I cannot explain why this restriction exist.