根据条件将不同的派生类分配给基类[重复]
Posted
技术标签:
【中文标题】根据条件将不同的派生类分配给基类[重复]【英文标题】:assign different derived classes to base class based on condition [duplicate] 【发布时间】:2021-10-01 17:36:59 【问题描述】:我有一个基类和两个派生类:
public class base1
public int property1;
public class child1 : base1
public int property2;
public class child2 : base1
public int property3;
当我像这样分配newProp
变量时:
int i = 2;
base1 newProp = (i == 0 ? new child1
property1 = 1,
property2 = 3
: null);
它工作正常,newProp
类型更改为 child1
类类型,
但我尝试做的是这样的:
int i = 2;
base1 newProp = (i == 0 ? new child1
property1 = 1,
property2 = 3
: new child2
property1 = 4,
property3 = 6
);
但我收到此错误
Type of conditional expression cannot be determined because there is no implicit conversion between `class1` and `class2`
有什么办法吗?
【问题讨论】:
我认为你应该使用常规的 if else 语句而不是使用内联运算符 您的代码甚至无法编译。 在修正语法规则后,一切都会编译,不需要这个问题。 这个问题与那些仍然必须使用 C#9.0 之前的 C# 版本的人有关 【参考方案1】:正如 Lasse V. Karlsen 的评论中提到的,在 C# 8.0 及更早版本中,第一个结果运算符和第二个结果运算符的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。 (see ?: operator (C# reference))
将其中一个显式转换为 base1
应该可以解决问题:
int i = 2;
base1 newProp = (i == 0
? (base1)new child1
property1 = 1,
property2 = 3
: new child2
property1 = 4,
property3 = 6
);
或
int i = 2;
base1 newProp = (i == 0
? new child1
property1 = 1,
property2 = 3
: (base1)new child2
property1 = 4,
property3 = 6
);
从 C# 9.0 开始,结果是目标类型的。 (again see ?: operator (C# reference))
但前提是目标类型已知(不使用var
)。
在这种情况下,您的示例代码不会出现错误。
【讨论】:
问号后面的类型并不总是这样。在 C# 8 或更早版本中,x ? a ? b
中的两个分支 a 和 b 必须是同一类型,或者其中一个类型必须可转换为另一个。在 C# 9 中,如果它们与整个表达式的目标类型兼容是可以的,这意味着在这种情况下 Base
因为目标类型是 Base
由于分配。在 C# 8 或更早版本中,(i == 2) ? "" : new object()
的类型是 object
,而不是 string
,因此它不是“? 之后元素的类型”。【参考方案2】:
只需通过将分支之一转换为基类来帮助编译器:
Base newProp =
(i == 0
? (Base)new Child1
property1 = 1,
property2 = 3
: new Child2
property1 = 4,
property3 = 6
);
【讨论】:
以上是关于根据条件将不同的派生类分配给基类[重复]的主要内容,如果未能解决你的问题,请参考以下文章