我创建了一个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取消装箱吗?
答案 0 :(得分:3)
有没有办法保证我的Observable可以作为bool取消装箱?
没有。此代码让人联想到Nullable
,并且直接得到编译器的支持以完成任务。
问题是implicit
在运行时不会创建真正的隐式转换。这纯粹是编译时的语法糖。每当编译器注意到您尝试将类型X
的表达式放入期望类型为Y
的变量时,它会在X
和Y
的定义中查找,在编译时,对于隐式转换运算符,如果找到,则放置适当的静态方法调用以进行转换。到达运行时,任何隐式(或显式)转换运算符都不会消息。剩下的就是少数语言,例如基本类型之间和类型层次结构中的类型。