枚举参数在 C# 中可以是可选的吗?

Can enum parameter be optional in c#?

我已经使用 this helpful post 学习如何将枚举值列表作为参数传递。

现在我想知道是否可以将此参数设为可选?

示例:

   public enum EnumColors
    {
        [Flags]
        Red = 1,
        Green = 2,
        Blue = 4,
        Black = 8
    }

我想像这样调用接收 Enum 参数的函数:

DoSomethingWithColors(EnumColors.Red | EnumColors.Blue)

DoSomethingWithColors()

我的函数应该看起来像什么?

public void DoSomethingWithColors(EnumColors someColors = ??)
 {
  ...
  }

enum 是值类型,因此您可以使用可为 null 的值类型 EnumColors?...

void DoSomethingWithColors(EnumColors? colors = null)
{
    if (colors != null) { Console.WriteLine(colors.Value); }
}

然后将EnumColors?的默认值设置为null

另一个解决方案是将 EnumColors 设置为未使用的值...

void DoSomethingWithColors(EnumColors colors = (EnumColors)int.MinValue)
{
    if (colors != (EnumColors)int.MinValue) { Console.WriteLine(colors); }
}

是的,它可以是可选的。

[Flags]
public enum Flags
{
    F1 = 1,
    F2 = 2
}

public  void Func(Flags f = (Flags.F1 | Flags.F2)) {
    // body
}

然后您可以使用或不使用参数调用您的函数。如果你在没有任何参数的情况下调用它,你将得到 (Flags.F1 | Flags.F2) 作为传递给 f 参数的默认值

如果你不想有一个默认值,但参数仍然是可选的,你可以这样做

public  void Func(Flags? f = null) {
    if (f.HasValue) {

    }
}

你可以重载你的函数,所以写两个函数:

void DoSomethingWithColors(EnumColors colors)
{
    //DoWork
}

void DoSomethingWithColors()
{
    //Do another Work, or call DoSomethingWithColors(DefaultEnum)
}

以下代码完全有效:

void colorfunc(EnumColors color = EnumColors.Black)
{
    //whatever        
}

可以这样调用:

colorfunc();
colorfunc(EnumColors.Blue);