【问题标题】:Casting to different types with the conditional operator使用条件运算符转换为不同的类型
【发布时间】:2013-10-06 17:20:41
【问题描述】:

我正在尝试检查我的对象信息是 word.Selection 还是 word.Document,然后稍后在我的程序中使用它。

这就是我遇到麻烦的地方。

 object info;
 var doc = info is word.Document ? info as word.Document : info as word.Selection;
 //do something with doc.Words;

它返回这个错误:

无法确定条件表达式的类型,因为存在 之间没有隐式转换 'Microsoft.Office.Interop.Word.Document' 和 'Microsoft.Office.Interop.Word.Selection'

我似乎无法绕过这个错误

【问题讨论】:

  • 一般来说,使用is 运算符,然后使用as 运算符或强制转换是代码异味 - 如果您想尝试强制转换,请尝试强制转换,这个is 运算符是当你不想真的想要投射时很有用。

标签: c# operators conditional


【解决方案1】:

当您使用?: 运算符时,两个结果必须属于同一类型。

使用标准 if case:

if(info is word.Document)
{
    //your code
}
else
{
}

【讨论】:

  • 我可以使用其他方法来处理 word.Document 或 word.Selection 吗?使用 if 语句会使我的代码加倍。
  • @ismellike:试试这个var doc = info as word.Document ?? info as word.Selection。如果转换失败,as 转换将返回 null,如果前一个值为 null,则空合并运算符将执行第二部分。
  • @JeroenVannevel +1 不错。你有没有想过写一个答案?它也可能是 OP 正在寻找的那个。
  • 我已将其添加为下面的答案。
  • 我已经删除了我的答案。正如您在此答案中所见,必须在两种类型之间进行隐式转换才能执行此操作。 stackoverflow.com/questions/7829903/…
【解决方案2】:

来自?: Operator (C# Reference)

first_expression 和 second_expression 的类型必须是 相同,或者必须存在从一种类型到另一种类型的隐式转换。

在您的第一个表达式中返回word.Document,但第二个表达式返回word.Selection。由于它们不一样,而且看起来它们之间也没有隐含的对话。

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2013-09-17
    • 2014-10-04
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多