【问题标题】:Passing by enum class variables in C# via parameters to a function在 C# 中通过参数将枚举类变量传递给函数
【发布时间】:2016-09-13 19:34:49
【问题描述】:

我在这里很困惑。假设我在 Visual Studios 中有两个程序 - 我正在使用 C# WPF。假设我有两个程序,其中 Program 1 有 Program 2 作为参考 - 同样 Program 2 有 Program 1 作为参考。

Program1.sol

p1.xaml.cs 内容:

public void checkStuff(myThing x)
{
   // Do stuff (irrelevant)
}

public enum myThing
{
  stuff,
  stuff2,
  stuff3,
  stuff4
}

Program2.sol

p2.xaml.cs 内容:

// Let's say I call that function
p1 p1content = new p1();
p1content.checkStuff(0); // <-- Why does this work??

我的问题是,为什么将数字 0 用作参数?这可能是微不足道的,但是当我传入 0 时,程序认为我传入的函数到底是什么?一开始我以为是我的枚举类中的变量的索引,但不可能是因为我不能传入1,2,3等等。

【问题讨论】:

  • 仅供参考,enumenumerator 在 C# 中是非常不同的东西。你在谈论枚举
  • 我不认为你可以像你描述的那样有循环引用。
  • 谢谢@ScottChamberlain,Jamiec 到底是什么意思
  • 这不是一个重复的问题,但它是相关的。枚举是整数值类型,因此需要一个默认初始化值,该值自然选择为零。由于枚举可以默认初始化为零,因此语言设计者选择允许任何枚举也显式初始化为零。因此,您可以将 0 分配给任何枚举,但不能分配任何其他整数(不进行强制转换)。
  • "当我没有为0 定义值时,为什么传递0 有效?" :stackoverflow.com/questions/6413804

标签: c# enums


【解决方案1】:

默认情况下,在 C# 中,enums 的基础类型是 int。请参阅MSDN documentation

正如this SO post的评论中提到的:

enum 关键字用于声明一个枚举,一个独特的类型 由一组称为枚举数列表的命名常量组成。 每个枚举类型都有一个底层类型,它可以是任何 char 以外的整型。

枚举有一个基于整数的值作为基数(int、byte、ulong 等)。编译器只接受零分配,以保证即使没有为枚举属性分配显式值,也可以初始化基于枚举的类型的变量。但是,编译器不接受任何其他值。这是一种内置的安全性,但更多的是解决编译器设计中的缺陷以解决以前与枚举不一致的行为的折衷方案。 This little story 由 Eric Lippert 提供,深入了解它是如何形成的。

【讨论】:

  • 那又怎样?那为什么我不能传入除 0 以外的另一个整数呢?
  • @Shammy:您可以转换这些值 ((myThing)3)。我认为第零个元素的存在是有保证的,其他的则不然。
  • 你可以,只是你不知道系统将它们设置为什么。如果您确实想传入数字或打印出来以检查系统分配的数字,您可以手动设置它们。 0 仅分配给第一个值,之后,您需要查看文档
  • 您不能将除零以外的任何其他整数传递给期望枚举的方法,而无需强制转换。但是你可以在不强制转换的情况下传递零。这个答案没有解决 OP 的问题。
  • 谢谢马修! @MatthewWatson
【解决方案2】:

当您声明一个枚举(例如您的问题中的那个)时,引擎盖下实际发生的事情(ish)是这样的:

public enum myThing : int
{
  stuff = 0,
  stuff2 = 1,
  stuff3 = 2,
  stuff4 = 3
}

enum 的默认基础类型是int,并且字段从零开始按顺序开始。

奇怪的是,这只适用于零元素,例如:

checkStuff(0);

但这不会

checkStuff(1); //error

你需要明确

checkStuff((myThing)1); //cast int to myThing

【讨论】:

  • 您在哪里看到隐含值 0 被“添加”到枚举中?如果我这样做 Enum.IsDefined(typeof(myThing),0) 我会得到 false 这告诉我它定义。
  • 看这里的第一个例子@DStanley:msdn.microsoft.com/en-gb/library/sbbt4032.aspx(定义状态为By default, the first enumerator has the value 0, and the value of each successive enumerator is increased by 1.
  • 好吧,我以为你是说0 的隐式值添加。我误读了原来的问题;我的错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
相关资源
最近更新 更多