1

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

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;

有什么办法可以保证 myObservable<bool>可以作为布尔值拆箱?

4

1 回答 1

3

有什么办法可以保证我的 Observable 可以作为布尔值拆箱?

不。这段代码让人想起Nullable,并且需要编译器的直接支持来完成任务。

问题是implicit在运行时不会创建真正的隐式转换。它纯粹是编译时语法糖。每当编译器注意到您试图将类型表达式X放入期望类型的变量中时,它会在编译时查找andY的定义中的隐式转换运算符,如果找到,则放入适当的静态方法调用到位做转换。到运行时,您不知道任何隐式(或显式)转换运算符。剩下的就是语言中的少数几个,例如原始类型之间以及类型层次结构中的类型之间。XY

于 2013-01-14T21:47:02.360 回答