c# – 为什么我的转换器会出现无效的转换错误?

前端之家收集整理的这篇文章主要介绍了c# – 为什么我的转换器会出现无效的转换错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了一个转换器,从double转换为整数.

但是行“return(int)value;”总是得到“指定演员阵容无效”.

我该怎么做才能让我的Converter成功转换一个double并发回一个整数?

转换器:

  1. namespace TestChangeAngle
  2. {
  3. [ValueConversion(typeof(double),typeof(int))]
  4. class DoubleToIntegerConverter : IValueConverter
  5. {
  6. #region IValueConverter Members
  7.  
  8. public object Convert(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture)
  9. {
  10. return (int)value;
  11. }
  12.  
  13. public object ConvertBack(object value,System.Globalization.CultureInfo culture)
  14. {
  15. throw new NotImplementedException();
  16. }
  17.  
  18. #endregion
  19. }
  20. }

XAML:

  1. <Page x:Class="TestChangeAngle.Page1"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:local="clr-namespace:TestChangeAngle"
  5. Title="Page1">
  6. <Page.Resources>
  7. <local:DoubleToIntegerConverter x:Key="DoubleToIntegerConverter"/>
  8. </Page.Resources>
  9.  
  10. <StackPanel HorizontalAlignment="Left" Margin="20">
  11. <Image Source="images\logo2.png"
  12. RenderTransformOrigin="0.5,0.5"
  13. Width="100"
  14. Margin="10">
  15. <Image.RenderTransform>
  16. <RotateTransform Angle="{Binding ElementName=TheSlider,Path=Value}"/>
  17. </Image.RenderTransform>
  18. </Image>
  19. <Slider x:Name="TheSlider"
  20. Width="200"
  21. Minimum="0"
  22. Maximum="360"
  23. HorizontalAlignment="Center"
  24. Margin="10"
  25. Cursor="Hand"/>
  26. <TextBox x:Name="TheAngle"
  27. Margin="10"
  28. Width="100">
  29. <TextBox.Text>
  30. <Binding ElementName="TheSlider"
  31. Path="Value"
  32. UpdateSourceTrigger="PropertyChanged"
  33. Converter="{StaticResource DoubleToIntegerConverter}"
  34. Mode="TwoWay">
  35. <Binding.ValidationRules>
  36. <local:MinMaxValidationRule Minimum="0" Maximum="360"/>
  37. </Binding.ValidationRules>
  38. </Binding>
  39. </TextBox.Text>
  40. </TextBox>
  41.  
  42. </StackPanel>
  43. </Page>

解决方法

您正在尝试将(不转换)从double转换为int,这将无效.你需要进行隐式转换或使用Convert.ToInt32() – 因为参数实际上是对象类型我认为你需要后者来保持编译器满意.是否要包含文化格式提供程序取决于您.
  1. public object Convert(object value,System.Globalization.CultureInfo culture)
  2. {
  3. return Convert.ToInt32(value);
  4. }

当对象具有相同的形状时,即当一个对象是您要转换的类型的实例时,可以使用强制转换操作符.例如,如果类Foo扩展了类Bar,那么您可以将类型为Foo的对象转换为类型Bar – 因为Foo对象具有Bar对象所具有的所有方法属性.但是,您无法将类型为Bar的对象强制转换为Foo,因为通过添加Bar对象不具有的方法属性,Foo会更改(或者可以更改,就编译器而言)Bar的形状.

在你的情况下,你正在处理只共享对象接口的原始类型 – 除了它们都是从对象派生之外,它们之间没有继承关系.然而,两者之间存在隐含的转换.您可以将一种类型的对象分配给另一种类型的变量,但可能会丢失该值的某些精度.

  1. double x = 1.1;
  2. int y = 0;
  3.  
  4. y = x; // implicit conversion,this works,y will be 1
  5. x = y; // implicit conversion,x will be 1.0

但是,您不能将一种类型的对象强制转换为另一种对象.强制转换意味着您将使用该对象,就好像它是另一种类型一样.在这种情况下,形状不同,无法完成.

猜你在找的C#相关文章