我使用的是WPF,我有一个转换器,用于多绑定的子字符串。在这个转换器中,我使用简单的do值-值1,但是在完成此转换之前,我需要将数据转换为相同的数据类型,如下所示:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values[0] is short)
{
return (short)values[0] - (short)values[1];
}
if (values[0] is float)
{
return (float)values[0] - (float)values[1];
}
if (values[0] is double)
{
return (double)values[0] - (double)values[1];
}
return (int)values[0] - (int)values[1];
}但是,当我试图在没有绑定/路径/引用/资源的情况下通过System.Int32将.xaml转换成双倍时,就会出现问题;
<TextBox.Width>
<MultiBinding Converter="{StaticResource Subtraction}">
<Binding Path="ActualWidth" ElementName="b"/>
<Binding>
<Binding.Source>
<sys:Int32>17</sys:Int32>
</Binding.Source>
</Binding>
</MultiBinding>系统信息系统是: xmlns:sys="clr-namespace:System;assembly=mscorlib“
所以我做了一些测试,把它添加到转换器中:

这给了我这些结果,注意"test“和”1值“都是完全相同的数据类型(System.Int32),但它们的行为不同。一种导致错误,另一种则不会。有什么关系?
使用System.Convert.ToDouble()代替使用(double)进行转换解决了这个问题。但我还是想知道为什么另一种方式不起作用。难道Int32和另一个Int32的行为不应该完全一样吗?造成这种不同行为的潜在原因是什么?
发布于 2022-04-13 13:39:58
值是一个装箱对象的数组。在转换数据类型之前,需要先取消对象的装箱。
由于values1是一个int,所以首先需要用( int )解压缩它,然后可以将int转换为double。
(double)(int)values[1]但是,只有当被装箱到values1中的数据类型是整数时,这才能工作。因此,最好使用System.Convert.ToDouble()。
对装箱值的更多解释:为什么我们需要在C#中进行装箱和取消装箱?
https://stackoverflow.com/questions/71854316
复制相似问题