C# 枚举的定义不提供索引中的值

C# 枚举的定义不提供索引中的值,c#,.net,enums,enumeration,tryparse,C#,.net,Enums,Enumeration,Tryparse,亲爱的朋友们: public enum Units { Meter = 0, Centimeter = 1, Milimeter = 2 } unitEnumStringOrIndex = "Meter"; //Working unitEnumStringOrIndex = "1";// Not working if(Enum.TryParse<Unit

亲爱的朋友们:

 public enum Units
    {
      Meter = 0,
      Centimeter = 1,
      Milimeter = 2
    }
    
    unitEnumStringOrIndex = "Meter"; //Working
    unitEnumStringOrIndex = "1";// Not working
    
    if(Enum.TryParse<Units>(unitEnumStringOrIndex, true, out Units unitEnum))
    {
      if(Enum.IsDefined(typeof(Units), unitEnumStringOrIndex))
        {
           return true;
        }else {
           return false;
        }
     }else {
      return false;
     }
公共枚举单位
{
米=0,
厘米=1,
毫米=2
}
unitEnumStringOrIndex=“米”//工作
unitEnumStringOrIndex=“1”//不起作用
if(Enum.TryParse(unitEnumStringOrIndex,true,out Units unitEnum))
{
如果(枚举已定义(类型(单位),unitEnumStringOrIndex))
{
返回true;
}否则{
返回false;
}
}否则{
返回false;
}
我有一个奇怪的问题,你可以从上面的例子中看到。我们有一个枚举类型,我们希望确保枚举值存在。因此,我在Microsoft文档中读到,我们可以使用IsDefined方法来确保存在。 我实现了这一点,当我们传递“Meter”字符串时,我可以看到它返回正确的值,但类似的方式,如果我传递“1”,那么它不会返回true。因此,我不会像预期的那样返回厘米值。 任何潜在客户都会很感激。
提前感谢。

基本上,您希望通过值获取枚举名称,因此可以这样做

int val = 1;
Units enumValue = (Units)val;
string stringName = enumValue.ToString(); //Centimeter 

您正在将索引号作为
stirng
传递,您应该将其作为
int
传递

if(Enum.IsDefined(typeof(Units), 1)) //true
if(Enum.IsDefined(typeof(Units), "1")) //false

实际上,当您使用
unitEnumStringOrIndex=“1”
unitEnum按预期获取值“厘米”。
问题在于Enum.idedefine:这需要一个对象,该对象的名称为字符串,值为整数。由于您正在传递字符串(“1”),因此“IsDefined”将查找枚举中不存在的名称“1”。

它工作正常,只是没有达到预期效果

TryParse
方法将成功解析该值,无论它是包含
enum
成员之一的名称的字符串,还是可以解析为
enum
成员之一的值的字符串

将一个或多个枚举常量的名称或数值的字符串表示形式转换为等效的枚举对象。返回值指示转换是否成功

这意味着当您尝试解析字符串
“Meter”
时,结果是
单位.Meter
,但当您尝试解析字符串
“1”
时,结果是
单位.cm

方法记录如下:

返回一个布尔值,说明指定枚举中是否存在给定整数值或其名称(作为字符串)

这意味着,如果使用
“1”或
1
对其进行馈送,则它会执行不同的操作-字符串与任何
枚举
成员的名称不匹配,因此
已定义
返回
false
,但是,int与
enum
成员之一的值匹配,因此
IsDefined
返回
true


您可以在

上看到一个实时演示。您可以尝试此操作来检查文本字符串还是整字符串值:

结果


查看在线工作代码@All:我发现我的错误只需要传递unitEnum,因为它给出了已经转换的整数值。现在工作正常。感谢所有成员的建议和示例。因此,我将此标记为已解决。
static void Test()
{
  var values = new string[]
  {
    "Meter",
    "1",
    "Meterr",
    "10"
  };
  foreach ( string value in values )
    Console.WriteLine(IsUnitsNameOrValue(value));
}

static public bool IsUnitsNameOrValue(string value)
{
  if ( int.TryParse(value, out int valueInt) )
    return Enum.IsDefined(typeof(Units), valueInt);
  else
    return Enum.TryParse(value, true, out Units unitEnum);
}
True
True
False
False