2011-04-15 35 views
0

我有一个字符串来刷,我在WPF使用基于文本的内容上色列表框项目转换器。C#隐式转换+开箱+条件表达式

然而,正如你可能已经知道,列表框的行为时,越野车使用相同的文字更字符串项目里面,你开始点击随便你可以得到更多选择的项目(视觉)。

为了解决这个问题,我创建了一个类作为字符串隐式使用的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”和“串'隐式地转换为另一个

我们正在调整一个字符串,并且在任何情况下都存在隐式转换,所以我尝试使用条件表达式来选择'p ath'以正确拆箱。

这里的问题是,我不能使用

String txt = (String)value; 

String txt = (OutputMessage)value; 

,因为列表框项目可以是任何两个,并从拆箱对象的值将失败。

我最终与if语句和类型检查解决了这个问题,但还挺杀死隐式转换的有效性。我希望条件表达式coudl处理这个:(

+0

BTW,这无关拆箱;这仅适用于值类型。 – SLaks 2011-04-15 16:21:57

回答

1

你可以这样做:

String txt = value is OutputMessage ? (String)(OutputMessage)value : (String)value; 

或者,你可以修改OutputMessage使得转换之一是明确的,而不是隐(即允许字符串是隐式转换为OutputMessage,但需要OutputMessages显式转换为字符串。

+0

哇,我从来没有想过unbox +投在条件的一边。这优雅地解决了这个问题。谢谢! :) – 2011-04-15 00:48:46

2

的问题,因为你知道的是,你有两种类型,可隐式转换为彼此。

String txt = value is OutputMessage ? (OutputMessage)value : (String)value; 

要执行这个语句,赋值的RHS被评估第一,你最终可能被解释为具有类型OutputMessageString的表达。它没有考虑到语句的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; 
+0

我给你一个喜欢你,但因为丹首先回答我接受了他的答案。谢谢! – 2011-04-15 00:51:12

+0

var temp = value作为OutputMessage;将失败它是否有一个字符串里面,拆箱不会工作:/ – 2011-04-15 01:07:31

+0

@Marino:是'OutputMessage'值类型?如果是这样的话,那么这绝对不行。请注意,装箱只适用于值类型,否则将视为类型转换。 – 2011-04-15 02:10:09