C# 转换为C中的两种类型之一#

C# 转换为C中的两种类型之一#,c#,type-conversion,null-coalescing-operator,as-operator,C#,Type Conversion,Null Coalescing Operator,As Operator,如何在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); 但我得到了一个错误:

如何在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)


我错过了什么?如果
实例
也是
Foo
类型,我希望
特定实例
Foo
类型,或者如果
实例
Bar
类型,则
特定实例
应该是
Foo
类型。因为,如果
instance
不是
Foo
,我希望
(实例为Foo)
null

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


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

问题是:即使每个
Foo
和每个
Bar
都是
BaseCl
,没有
Foo
Bar
,反之亦然。那么您的
specificInstance
应该能够容纳什么呢<代码>Foo或
?因为两者都不可能。你必须分别处理这两种情况。或者,直接回答你的开场白:你不能。
if(instance是Foo-Foo){/*使用'Foo`*/}否则if(instance是Bar){/*使用'Bar`*/}
想象一下你可以这样做,Foo有一个名为
foometry()
的方法,Bar有一个名为
BarMethod()
的方法。如果
specificInstance
实际上是一个
条,那么
specificInstance.FooMethod()
会做什么?