Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用整数枚举而不强制转换#_C#_Enums_Casting - Fatal编程技术网

C# 在C中使用整数枚举而不强制转换#

C# 在C中使用整数枚举而不强制转换#,c#,enums,casting,C#,Enums,Casting,下午好,假设我有枚举 public enum Test : int { TestValue1 = 0, TestValue2, TestValue3 } 为什么我不能使用像Int32 IntTest=Test.TestValue1这样的语句,而不使用转换来表示IntTest=0?如果我以后决定向枚举中添加更多项,这会很有用吗?我想我不得不使用Int32 IntTest=(Int32)Test.TestValue1,我认为这应该是多余的。。。还有,为什么我不能做这样的

下午好,假设我有枚举

public enum Test : int 
{ 
   TestValue1 = 0, 
   TestValue2, 
   TestValue3 
}
为什么我不能使用像
Int32 IntTest=Test.TestValue1
这样的语句,而不使用转换来表示
IntTest=0
?如果我以后决定向枚举中添加更多项,这会很有用吗?我想我不得不使用
Int32 IntTest=(Int32)Test.TestValue1
,我认为这应该是多余的。。。还有,为什么我不能做这样的东西

switch (IntTest)
{
    case (Test.TestValue1) : DoSomething();
                             break;
    case (Test.TestValue2) : DoSomethingElse();
                             break;
    default                : Do Nothing();
}
??编译器说它需要一个常量值来代替
TestValue1
。。。这个值不是常数吗


非常感谢。

您必须进行转换,因为语言定义中说您必须进行转换。冗余的大概但事实就是这样

对于您的
开关
语句:

switch (IntTest)
{
    case (int)Test.TestValue1: DoSomething(); break;
}

枚举值必须使用枚举类型的名称完全限定。

不能互换地使用
Int32
Test
,因为它们在语义上是不同的类型,即使它们恰好使用相同的底层存储机制

如果需要
Int32
,请使用
Int32
;如果需要
测试
,请使用
测试
;如果需要在它们之间转换,则使用显式强制转换

(当然,该语言可以很容易地被规范为隐式地允许这些转换,但这样的“特性”可能会产生比它解决的问题更多的问题。)

  • 首先,枚举的
    :int
    部分是完全冗余的,因为
    int
    已经是枚举的默认管理类型

  • 之所以需要强制转换,是因为在编写枚举时,实际上是在定义一个新的
    类型
    ,很像一个类。名为
    Test
    的枚举的任何值的类型为
    Test


enums的工作原理与设计类似
正如msdn所说:

基础类型指定了多少 存储分配给每个 统计员。但是,显式强制转换 必须从枚举类型转换 一个完整的类型


嘿嘿,我刚刚读了我书中的这一章

我想告诉你的第一件事就是试试这个

Console.WriteLine(Test.TestValue1);
你会注意到一些事情

输出不是数字,甚至不是整数

此外,这也应该回答你的第二个问题

因此,每次都必须将枚举显式转换为整数


:)

正如Paul指出的,您有一个语法错误,应该可以解决(您显然已经修复了该错误)。正如其他人指出的那样,测试是一种枚举,它保存整数的值。例如,可以使用枚举轻松处理x0001或0xA0BC(41148)等值

在您使用的示例中,Int32 IntTest是一个32位整数;我可能会补充说,您应该使用int而不是Int32,除非您的枚举包含的不是整数,否则甚至不要指定:int,因为默认的保留类型确实是整数

关于编译器强制您对值进行大小写的原因;这就是它的工作方式,枚举不是整数,只有其可能的子属性(TestValue1、TestValue2、TestValue3)的值是整数。*


正如有人指出的,将在控制台中打印的内容。WriteLine不是整数。*

请注意,您可以这样做:

switch ((Test)IntTest)
{
    case (Test.TestValue1) : DoSomething();
                             break;
    case (Test.TestValue2) : DoSomethingElse();
                             break;
    default                : DoNothing();
}

从int测试的强制转换保证不会失败,即使枚举中不存在该值。如果枚举中不存在该值,则在测试实例上调用ToString()将返回基础数值的字符串表示形式。

我希望以与此相同的方式实现枚举,以便更轻松地将使用表列名作为字符串的应用程序转换为索引

这就是我想要实现的目标:

enum TableName
{
    Column1Name = 0
}

Column1Data = (cast)objData[RowIndex][TableName.Column1Name];
上面提到的问题是,在使用enum时,C#需要显式强制转换

Column1Data = (cast)objData[RowIndex][(int)TableName.Column1Name]; //what a waste of time..
但我有一个解决办法。。抱怨你想要的一切:P(这不是一个生产应用程序-在实时环境中实现它之前,请仔细考虑此代码的影响)

在方法中,可以将枚举用作类型。
只需打开一个Test类型的变量,就不需要将枚举强制转换为int

public void DoSwitch(Test val)
{
   switch (val)
   {
       case (Test.TestValue1) : DoSomething();
                                break;
       case (Test.TestValue2) : DoSomethingElse();
                                break;
       default                : Do Nothing();
   }
}

它不应该是“case(Test.TestValue1)”而不是“case(TestValue1)”吗?你想和枚举进行比较,对吗?@Paul:使用tilde,而不是撇号是的,你是对的!非常感谢,谢谢你!好提示。
public enum Test
{ 
   TestValue1 = 0, 
   TestValue2, 
   TestValue3 
}
public void DoSwitch(Test val)
{
   switch (val)
   {
       case (Test.TestValue1) : DoSomething();
                                break;
       case (Test.TestValue2) : DoSomethingElse();
                                break;
       default                : Do Nothing();
   }
}