【问题标题】:I feel that the 1st argument of Enum.Format() is a bit redundant我觉得 Enum.Format() 的第一个参数有点多余
【发布时间】:2015-06-15 08:22:43
【问题描述】:

我把代码搞砸了:

enum Days
{
    day1,
    day2,
    day3
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Enum.Format(typeof(Days), Days.day2, "D"));
    }
}

我觉得 Enum.Format() 的第一个参数是多余的:因为第二个参数已经指定了 Enum 的类型,所以编译器会有“day2”的类型是“Days”的信息。那么为什么编译不推断第一个参数是“typeof(Days)”,为什么我必须指定它?

换句话说,我的意思是,如果 Enum.Format 的 .net 函数只有 2 个参数,为什么不能呢?类型可以从 value 参数中得知。

【问题讨论】:

  • 您可以为第二个参数传递一个完全不同的值,例如任何整数值,而不仅仅是枚举值。
  • 请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”!
  • Format 不是通用函数,它接收一个 object 值。它确实知道类型,除非你指定它。这样做的原因是枚举值或多或少是某个基础数值上的标签。您可以在使用枚举的任何地方传递基础值(例如 int)
  • @PanagiotisKanavos 你的论点的两个部分是完全脱节的。装箱的枚举值保持其类型。真正需要该类型的唯一情况是您想使用底层类型(int)。

标签: c# types enums format arguments


【解决方案1】:

因为可以在value参数中使用enum的底层类型,比如:

public enum MyEnum
{
    Foo = 1
}

string str = Enum.Format(typeof(MyEnum), 1, "G"); // Foo

但请注意:

public enum MyEnum : long
{
    Foo = 1
}

string str = Enum.Format(typeof(MyEnum), 1L, "G");

正如我所写,您必须使用底层类型!所以在这种情况下,long

Enum.Format 中非常间接地说明了这一点:

ArgumentException: value 的类型不是 enumType 的基础类型。

所以隐含地,如果 valueenumType 的底层类型,那么没有异常并返回一些结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多