7

doubleからintegerに変換するコンバーターを作成しました。

しかし、「return(int)value;」という行 常に「指定されたキャストは無効です」を取得します。

コンバーターがdoubleを正常に変換し、整数を送り返すにはどうすればよいですか?

コンバータ:

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
    }
}

XAML:

<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>
4

4 に答える 4

8

doubleからintにキャスト(変換ではない)しようとしていますが、これは機能しません。暗黙的な変換を行うか、Convert.ToInt32()を使用する必要があります。引数は実際にはオブジェクト型であるため、コンパイラーを満足させるには後者が必要になると思います。カルチャのフォーマットプロバイダーを含めるかどうかはあなた次第です。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return Convert.ToInt32(value);
}

オブジェクトの形状が同じである場合、つまり、1つのオブジェクトがキャスト先のタイプのインスタンスである場合に、キャスト演算子を使用できます。たとえば、クラスFooがクラスBarを拡張する場合、タイプFooのオブジェクトをタイプBarにキャストできます。これは、FooオブジェクトにはBarオブジェクトと同じすべてのメソッドとプロパティがあるためです。ただし、 Barオブジェクトにないメソッドまたはプロパティを追加することでFooがBarの形状を変更する(またはコンパイラに関する限り変更できる)ため、Bar型のオブジェクトをFoo型にキャストすることはできませんでした。 。

あなたの場合、オブジェクトインターフェイスのみを共有するプリミティブ型を扱っています。両方がオブジェクトから派生していることを除いて、それらの間に継承関係はありません。ただし、 2つの間に暗黙の変換があります。オブジェクトの1つのタイプを他のタイプの変数に割り当てることができますが、値の精度がいくらか失われる可能性があります。

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

ただし、あるタイプのオブジェクトを別のタイプにキャストすることはできません。キャストとは、オブジェクトを他のタイプのオブジェクトと同じように使用することを意味します。この場合、が異なり、それを行うことはできません。

于 2009-05-17T13:58:35.070 に答える
3

問題は、開梱とキャストの両方を同時に行おうとしていることです。これは失敗します。最初に箱を開けてから、適切なタイプにキャストする必要があります。

return (int)(double)value;

Eric Lippert最近、これが必要な理由についての素晴らしい記事を書きました。読む価値があります

于 2009-05-17T14:13:08.577 に答える
1

double値はオブジェクト内でボックス化されており、値を取得する唯一の方法は、ボックス化を解除することですdouble。その後、それをにキャストできますint

return (int)(double)value;

(tvanfossonが提案したように)メソッドを使用することもできますConvert.ToInt32(object)。これにより、オブジェクトがIConvertibleにキャストされ、その仮想ToInt32メソッドが呼び出され、次にConvert.ToInt32(double)メソッドが呼び出されます。もちろん、それはもう少しオーバーヘッドです。

于 2009-05-17T14:16:48.303 に答える
1

変換したいのですが、doubleからintへのキャストを行っています。これを試して:

    public object Convert(object value, ...)
    {
        return (int)(double)value;
    }
于 2009-05-17T14:18:06.490 に答える