なぜ私のコンバータを無効にキャストエラー?
-
22-08-2019 - |
質問
作成したコンバーター変換からダブルの整数値です。
そ線"return(int)値"が"特定キャストは無効です。"
何か私はできるようにコンバータに成功しに変換し、ダブルおよび返送の整数?
コンバータ:
namespace TestChangeAngle
{
[ValueConversion(typeof(double), typeof(int))]
class DoubleToIntegerConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (int)value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
}
ー:
<Page x:Class="TestChangeAngle.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestChangeAngle"
Title="Page1">
<Page.Resources>
<local:DoubleToIntegerConverter x:Key="DoubleToIntegerConverter"/>
</Page.Resources>
<StackPanel HorizontalAlignment="Left" Margin="20">
<Image Source="images\logo2.png"
RenderTransformOrigin="0.5, 0.5"
Width="100"
Margin="10">
<Image.RenderTransform>
<RotateTransform Angle="{Binding ElementName=TheSlider, Path=Value}"/>
</Image.RenderTransform>
</Image>
<Slider x:Name="TheSlider"
Width="200"
Minimum="0"
Maximum="360"
HorizontalAlignment="Center"
Margin="10"
Cursor="Hand"/>
<TextBox x:Name="TheAngle"
Margin="10"
Width="100">
<TextBox.Text>
<Binding ElementName="TheSlider"
Path="Value"
UpdateSourceTrigger="PropertyChanged"
Converter="{StaticResource DoubleToIntegerConverter}"
Mode="TwoWay">
<Binding.ValidationRules>
<local:MinMaxValidationRule Minimum="0" Maximum="360"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</StackPanel>
</Page>
解決
きるようにキャスト(変換)からダブルルをintとで、これがなくなります。だけ暗黙的に変換-利用ます。ToInt32()は引数が実際の型オブジェクトだと思いる必要がありま後半のコンパイラます。できるかどうかにしたいの文化の形式のプロバイダです。
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return Convert.ToInt32(value);
}
利用できるキャストオペレーターの場合、オブジェクトの同じ 形状, したときに、複数のオブジェクトは、型のインスタンスについても書いてください。。例えば、クラスFoo張クラスのバーできますので、そのキャスト型のオブジェクトをサイバーしているので、Fooオブジェクトは、すべてのメソッドとバーオブジェクトもしれません。せんでしたが、少し足を延ばせば、しかし、鋳型のオブジェクトーバータイプFooがFooの変化(または変更しない場合など、コンパイラに関)の 形状 バーリのバーの追加方法は物件では、バーオブジェクトなのです。
このケースをお持ちのプリミティブ型のみのオブジェクトインターフェースがないということで、継承関係していることを除いてないからオブジェクトです。が、しかし、暗黙的な 変換 間はご対応できませんを割り当てることができオブジェクト型変数へのその他のものだなあ精度の値です。
double x = 1.1;
int y = 0;
y = x; // implicit conversion, this works, y will be 1
x = y; // implicit conversion, this works, x will be 1.0
できないし、キャストオブジェクトの一つとができる。鋳造ることをお申し出いただき、オブジェクトまたはその他のタイプです。この場合、 形状 の違いはできません。
他のヒント
問題はきるようなもunboxキャストでも同時に行います。このことに失敗します。することができますのでunboxしてキャストを適切なタイプです。
return (int)(double)value;
エリック-Lippert最近書いた素敵な記事を正確になぜことが必要です。で、読み込み
の double
値が箱の中に、オブジェクトを取得する唯一の方法ではunboxとして double
.その後できるキャストで int
.
return (int)(double)value;
にお使いいただけます Convert.ToInt32(object)
方法としてtvanfosson示唆され、キャストのオブジェクトIConvertible電話で仮想 ToInt32
方法は、電話 Convert.ToInt32(double)
方法。ることはもちろんビットよりオーバーヘッド。
変換したいかを確認することができま鋳造からdoubleのint.してみてください:
public object Convert(object value, ...)
{
return (int)(double)value;
}