【发布时间】:2011-04-15 10:11:57
【问题描述】:
我有一个字符串到画笔转换器,我在 WPF 中使用它来根据文本内容为列表框项目着色。
但是,您可能已经知道,当内部有更多具有相同文本的字符串项时,列表框的行为会出现问题,并且您开始随意单击,您可以获得更多选定项(视觉上)。
为了解决这个问题,我创建了一个 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 txt = (String)value;
或
String txt = (OutputMessage)value;
因为列表框项目可以是两者中的任何一个,从对象中拆箱值将失败。
我最终用 if 语句和类型检查解决了这个问题,但这有点扼杀了隐式转换的用处。我希望条件表达式可以处理这个:(
【问题讨论】:
-
顺便说一句,这与拆箱无关;这仅适用于值类型。
标签: c# wpf implicit-conversion