【问题标题】:Why does casting an enum stored in an object to an int return a string?为什么将存储在对象中的枚举转换为 int 返回字符串?
【发布时间】:2011-08-18 17:57:23
【问题描述】:

我有一个object 类型的属性,它包含一个Enum 值,当我使用(int)value 对其进行转换时,它返回一个枚举名称的string。为什么?

我注意到这一点的代码在this answer 中。使用Convert.ToInt32() 正确地将Enum 转换为int,但我很好奇为什么在使用(int) 时会得到一个字符串。它甚至不会给我一个错误。

编辑

这是一个快速示例。我评论了我放置断点的位置,并使用即时窗口来确定输出是什么。

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public Int32 SomeNumber { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        SomeNumber = 1;
        RootWindow.DataContext = this;

    }
}

public enum MyEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}


/// <summary>
/// Returns true if the int value equals the Enum parameter, otherwise returns false
/// </summary>
public class IsIntEqualEnumParameterConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (parameter == null || value == null) return false;

        if (parameter.GetType().IsEnum && value is int)
        {
            // Breakpoint here
            return (int)parameter == (int)value;
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

MainWindow.xaml

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication5"
        Title="MainWindow" Height="350" Width="525"
        x:Name="RootWindow">

    <Window.Resources>
        <local:IsIntEqualEnumParameterConverter x:Key="IsIntEqualEnumParameterConverter" />
    </Window.Resources>

    <StackPanel>
        <TextBlock Text="{Binding SomeNumber, Converter={StaticResource IsIntEqualEnumParameterConverter}, ConverterParameter={x:Static local:MyEnum.Value1}}" />
    </StackPanel>
</Window>

编辑#2

只是希望消除一些混乱......

我说它正在返回一个字符串,因为在即时窗口中运行 ?((int)parameter) 正在返回枚举名称,而运行 ?System.Convert.ToInt32(parameter) 正在正确显示 int。

我后来发现它实际上一直在正确评估 DataTrigger。我认为这不是因为我的控件在运行时不可见,但是我发现这是因为我的 XAML 中的错误(我忘记了 Grid.Column 属性,所以一个控件与另一个控件重叠)。

抱歉这个令人困惑的问题。

编辑#3

这里有一些控制台应用程序代码演示了 Jon 的情况 :)

class Program
{
    static void Main(string[] args)
    {
        object value;
        value = Test.Value1;

        // Put breakpoint here
        // Run ?(int)value vs Convert.ToInt32(value) in the immediate window
        // Why does the first return Value1 while the 2nd returns 1?
        Console.ReadLine();
    }
}

public enum Test
{ 
    Value1 = 1
}

【问题讨论】:

  • 你是把它变成一个字符串吗?您是否将其投射到 Console.WriteLine() 中?我没有看到同样的问题。将其转换为 int 似乎给了我预期的行为。
  • 那是不可能的。你不能直接施法并得到不同类型的东西。
  • @Rachel 那只会以文本形式显示表达式的值;不过,表达式本身不是字符串。
  • 请粘贴您在即时窗口中看到的内容的副本。
  • 我刚刚尝试了 Rachel 的控制台代码,得到了相同的结果。有趣的是,如果将value 的类型更改为Test,它会显示为1...

标签: c# wpf enums


【解决方案1】:

听起来你被即时窗口欺骗了。目前尚不清楚您在即时窗口中做了什么,但我可以绝对肯定地说,如果您转换为int,您不会 em> 回复 string。类型系统完全阻止了这种情况的发生。

【讨论】:

  • 你是对的,输出中的值是正确的,只是在即时窗口中不正确。很高兴知道我不应该盲目相信即时窗口。 (我的 XAML 中有一个错误,这让我认为转换器总是返回 false,因为控件不可见)
  • 我在即时窗口中写入?((int)parameter),它返回Value1。运行 ?System.Convert.ToInt32(parameter) 正确返回 1
  • @Rachel:嗯……甚至无法重现。但我很少使用即时窗口开始:)
  • 奇怪,我把相关代码拉出来放在自己的应用程序中仔细检查,同样的事情发生了。如果您想尝试,我发布了我在示例中使用的代码。我正在使用 VS2010 Ultimate、SP1、AsyncCTP Refresh,并且没有任何模组。
  • @Rachel:我稍后会试一试。如果您也在控制台应用程序中看到它,它可能会更简单:) 如果我可以更简单地重现它,我会在此处发布该代码。
【解决方案2】:

您在此描述的内容在技术上是不可能的。您看到的是调试器显示的枚举成员的名称。把它想象成一种“语法糖”。所以真正的问题恕我直言,只是整数不相等。

要检查这个:

读取您的“字符串”,检查在声明的枚举中分配给的整数,并检查整数是否实际上等于函数中的参数。

【讨论】:

    【解决方案3】:

    您的问题实际上是“为什么”而不是“如何”,我意识到这一点。

    但是,方法如下:

    enum Options : int { one = 1, two = 2, three = 3 }
    public MainWindow()
    {
        InitializeComponent();
    
        object _Option = Options.three;
    
        // shows "three"
        MyTextBox.Text = ((Options)_Option).ToString();
    
        // shows "3"
        MyTextBox.Text = ((int)((Options)_Option)).ToString();
    }
    

    【讨论】:

      【解决方案4】:

      我已经将此代码示例运行到遗忘状态,但我发现它每次都返回 false,因为 value is int 失败了。 value 是一个对象,而不是一个整数。

      【讨论】:

      • parameter 的运行时值是一个枚举
      • 是的。我更正了我的说法。这就是你复制/粘贴时得到的。 :)
      【解决方案5】:

      我想正在发生的事情是您的 object parameterstring 值的形式出现,因此您对

      的调用
       if (parameter.GetType().IsEnum && value is int)
      

      是假的,你直接跳过正文和return false

      改为使用 Enum.Parse() 或 Convert.ToInt32() 将字符串更改为枚举值或 int 值,然后进行比较。

      【讨论】:

      • 不,该语句中的两个属性都为真
      • 不用担心,是根据当时的数据推测的。
      猜你喜欢
      • 2017-07-07
      • 2018-06-21
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多