J'ai une propriété de type object
, qui contient une valeur Enum
, et lorsque je la cast en utilisant (int)value
, elle renvoie string
du nom Enum. Pourquoi?Pourquoi la conversion d'une énumération stockée dans un objet en int renvoie-t-elle une chaîne?
Le code où j'ai remarqué ceci est dans this answer. L'utilisation de Convert.ToInt32()
convertit correctement le Enum
en int
, mais j'étais curieux de savoir pourquoi j'obtiendrais une chaîne en utilisant (int)
. Cela ne me jette même pas une erreur.
Modifier
Voici un échantillon rapide. J'ai commenté où j'ai mis le point d'arrêt, et utilisais la fenêtre immédiate pour déterminer ce que la sortie était.
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>
Edit # 2
Juste l'espoir d'éclaircir une certaine confusion ...
I a dit qu'il renvoyait une chaîne parce que le fonctionnement ?((int)parameter)
dans la fenêtre Exécution renvoyait le nom d'enum, tandis que l'exécution ?System.Convert.ToInt32(parameter)
affichait correctement l'int.
J'ai trouvé par la suite qu'il était en train d'évaluer correctement le DataTrigger tout au long. Je pensais que ce n'était pas parce que mon contrôle n'était pas visible à l'exécution, mais j'ai découvert que c'était à cause d'une erreur dans mon XAML (j'ai oublié une propriété Grid.Column
, donc un contrôle en chevauchait un autre).
Désolé pour la question déroutante.
Edit # 3
est ici un code d'application de la console montrant la situation juste pour 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
}
Pouvez-vous coller un exemple de travail du code? –
Est-ce que vous le mettez dans une chaîne? Est-ce que vous le lancez dans un Console.WriteLine()? Je ne vois pas le même problème. Casting à un int semble me donner le comportement attendu. –
Quelque chose d'autre se passe. 'object o = MyEnum.Blah; int i = (int) o; 'définit' i' à la valeur entière du membre de l'énumération. – dlev