내 변환기가 잘못된 캐스트 오류를 ​​제공하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/874635

문제

이중에서 정수로 변환 할 컨버터를 만들었습니다.

그러나 "return (int) value;"라인은 라인입니다. 항상 "지정된 캐스트는 유효하지 않습니다"를 얻습니다.

변환기가 두 배를 성공적으로 변환하고 정수를 다시 보내도록 어떻게해야합니까?

변환기:

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>
도움이 되었습니까?

해결책

당신은 두 배에서 INT로 캐스팅 (변환되지 않음)을 시도하고 있습니다. 암시 적 변환을 수행하거나 convert.toint32 ()를 사용해야합니다. 인수는 실제로 유형 객체이므로 컴파일러를 행복하게하기 위해 후자가 필요하다고 생각합니다. 문화의 형식 제공자를 포함시키고 싶은지 여부는 당신에게 달려 있습니다.

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

객체에 동일 할 때 캐스트 연산자를 사용할 수 있습니다. 모양, 즉, 하나의 객체가 주조 유형의 인스턴스 인 경우. 예를 들어, 클래스 FOO가 클래스 바를 확장하면 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;

Eric Lippert는 최근 이것이 왜 이것이 필요한지에 대한 좋은 기사를 썼습니다. 읽을 가치가 있습니다

그만큼 double 값은 객체 내부에 상자에 걸려 있으며, 그것을 꺼내는 유일한 방법은 그것을 double. 그 후에 당신은 그것을 an에 캐스팅 할 수 있습니다 int.

return (int)(double)value;

당신은 또한 사용할 수 있습니다 Convert.ToInt32(object) 메소드 (TVANFOSSON이 제안한대로)는 객체를 IconVertible에 캐스팅하고 가상으로 호출합니다. ToInt32 방법은 다음과 같이 호출됩니다 Convert.ToInt32(double) 방법. 물론 조금 더 오버 헤드입니다.

당신은 변환을 원하지만 두 배에서 int로 캐스팅을하고 있습니다. 이 시도:

    public object Convert(object value, ...)
    {
        return (int)(double)value;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top