C#隐式转换+拆箱+条件表达式

| 我有一个String to Brush转换器,我在WPF中使用它根据文本内容为Listbox项着色。 但是,您可能已经知道,当其中包含更多具有相同文本的字符串项目并且您开始随意单击即可(在视觉上)获得更多选择的项目时,列表框的行为有问题。 为了解决这个问题,我创建了一个类OutputMessage,将其隐式用作字符串,但是由于隐式转换会为每个字符串创建OutputMessage的新实例,因此列表框现在将转换实例而不是字符串值,并进行比较,并且行为正确。 但是我离开了日志管理器,在其中放置了纯字符串,因为它始终以当前时间作为前缀,并且没有重复项,因此不会发生此问题。 但是我发现转换器中的拆箱很糟糕:
 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            String txt = value is OutputMessage ? (OutputMessage)value : (String)value;
通过这样做,您将获得: 错误1无法确定条件表达式的类型,因为\'OutputMessage \'和\'string \'隐式地相互转换 我们正在分配给String,并且在任何情况下都存在隐式转换,因此我尝试使用条件表达式来选择\'path \'以正确地将值拆箱。 这里的问题是我不能使用
String txt = (String)value;
要么
String txt = (OutputMessage)value;
因为listbox项可以是两者中的任何一个,并且从对象中取消对值的装箱将失败。 我最终通过if语句和类型检查解决了这个问题,但是那有点杀死了隐式转换的用处。我希望条件表达式可以解决这个问题:(     
已邀请:
你可以做:
String txt = value is OutputMessage ? (String)(OutputMessage)value : (String)value;
或者,您可以修改OutputMessage,以便其中一种转换是显式的,而不是隐式的(即允许将String隐式转换为OutputMessage,但要求将OutputMessages显式转换为String。     
您知道的问题是,您有两种类型可以彼此隐式转换。
String txt = value is OutputMessage ? (OutputMessage)value : (String)value;
要执行此语句,首先要评估赋值的RHS,最后得到一个可以解释为类型为“ 5”或“ 6”的表达式。它不考虑该语句的LHS中的内容,因此对于编译器来说是不明确的。请记住,条件两部分的静态类型必须相同。在这种情况下,您应该明确要使用哪种类型,使条件的两个部分都成为
String
OutputMessage
类型。
String txt = value is OutputMessage ? (String)(OutputMessage)value : (String)value;
另一方面,我将以此方式重写它,以便您测试
OutputMessage
的类型(假设
OutputMessage
是引用类型):
var temp = value as OutputMessage;
String txt = temp != null ? (String)temp : (String)value;
    

要回复问题请先登录注册