我怎样才能保证我的课程可以作为特定类型取消装箱?

时间:2013-01-14 21:39:24

标签: c# wpf ivalueconverter unboxing

我创建了一个IValueConverter,它将bool转换为System.Windows.Visibility对象(它与BooleanToVisibilityConverter相反)。它工作正常,除非我尝试在Observable<bool>对象上使用它。 Observable<T>是我使用隐式运算符定义的类,用于将其转换为T.问题是当将其拆箱为bool时,我得到InvalidCastException

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if ((bool)value) // InvalidCastException
    {
        return Visibility.Hidden;
    }
    else
    {
        return Visibility.Visible;
    }
}

Observable被装箱为Object时,似乎C#忽略了我的隐式运算符。例如:

Observable<bool> obs = new SimpleObservable<bool>(true);
object obj = obs;

// This conversion works just fine:
bool bval = (bool)(Observable<bool>)obj;

// This conversion throws an InvalidCastException:
bval = (bool)obj;

有什么方法可以保证我的Observable<bool>可以作为一个bool取消装箱吗?

1 个答案:

答案 0 :(得分:3)

  

有没有办法保证我的Observable可以作为bool取消装箱?

没有。此代码让人联想到Nullable,并且直接得到编译器的支持以完成任务。

问题是implicit在运行时不会创建真正的隐式转换。这纯粹是编译时的语法糖。每当编译器注意到您尝试将类型X的表达式放入期望类型为Y的变量时,它会在XY的定义中查找,在编译时,对于隐式转换运算符,如果找到,则放置适当的静态方法调用以进行转换。到达运行时,任何隐式(或显式)转换运算符都不会消息。剩下的就是少数语言,例如基本类型之间和类型层次结构中的类型。