【问题标题】:Cast to one of two types in C#强制转换为 C# 中的两种类型之一
【发布时间】:2021-08-11 07:33:59
【问题描述】:

如何在 C# 中转换为两种类型之一?

这是我想要做的:

public class BaseCl {}
public class Foo : BaseCl {}
public class Bar : BaseCl {}

BaseCl instance;
... some code which puts a value in the `instance`
var specificInstance = (instance as Foo) ?? (instance as Bar);

但我收到一个错误:

运算符'??'不能应用于“Foo”和“Bar”类型的操作数 [Assembly-CSharp] csharp(CS0019)

我在这里缺少什么?如果instance 也是Foo 类型,我希望specificInstanceFoo 类型,或者如果instanceBar 类型是Bar。因为,如果 instance 不是 Foo 我希望 (instance as Foo)null

【问题讨论】:

  • 问题是:即使每个Foo 和每个Bar 都是BaseClno Foo 曾经是Bar,反之亦然。那么您的specificInstance 应该能够持有什么? Foo 还是 Bar?因为 both 是不可能的。您必须分别处理这两种情况。或者,直接回答您的开场问题:您不能。
  • if (instance is Foo foo) { /* Use `foo` */ } else if (instance is Bar bar) { /* Use `bar` */ }
  • 想象一下你可以做到这一点,而 Foo 有一个名为 FooMethod() 的方法,而 Bar 有一个名为 BarMethod() 的方法。如果specificInstance 实际上是Bar,你会期望specificInstance.FooMethod() 做什么?

标签: c# type-conversion null-coalescing-operator as-operator


【解决方案1】:

类型推断的重点是变量的类型可以从初始化表达式中推断出来。当初始化表达式应该能够产生两种不同的类型时,如何推断变量的类型?必须在编译时知道变量的类型,因为只有这样你才能知道可以编写什么代码来使用它。如果它可以是任何一种类型,你怎么可能使用该变量编写代码?您缺少的是您尝试做的事情是不可能的。

如果您想同时处理这两种类型,则需要编写条件代码,即 if 语句,检查一种类型,然后检查另一种类型,并声明每种类型的变量以在两种不同情况下使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多