C#根据三元条件初始化var

C#根据三元条件初始化var,c#,ternary-operator,C#,Ternary Operator,此代码: var userType = viewModel.UserType == UserType.Sales ? new Sales() : new Manager(); 给我以下编译器错误消息: 无法确定条件表达式的类型,因为存在 “Models.Sales”和“Models.Manager”之间没有隐式转换 为什么我不能根据条件的结果初始化变量?还是我做错了什么 编辑:@Tim Schmelter,我没

此代码:

var userType = viewModel.UserType == UserType.Sales 
                    ? new Sales() 
                    : new Manager();
给我以下编译器错误消息:

无法确定条件表达式的类型,因为存在 “Models.Sales”和“Models.Manager”之间没有隐式转换

为什么我不能根据条件的结果初始化变量?还是我做错了什么

编辑:@Tim Schmelter,我没有看到那篇帖子,我能找到的只有
int
null
bool
null

但没有自定义类型。

第一个_表达式和第二个_表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换


在您的代码中,不可能从
Sales
转换为
Manager
,或者从visa转换为
Manager
。因此,它们是不兼容的类型,在这种情况下,编译器无法确定类型。C#是静态类型语言(大部分),除非定义为动态,否则变量的类型不能是动态的。

您需要将第一种可能性转换为公共基类型或接口,例如:

var userType = viewModel.UserType == UserType.Sales 
                    ? (IUser)new Sales() 
                    : new Manager();

否则,编译器不知道应该创建什么类型,将使用
Sales
,因此在尝试分配
Manager
实例时将失败。

您需要明确声明
userType
Sales
Manager
的常见类型。例如,如果它们都来自
User
,则执行以下操作:

User userType = viewModel.UserType == UserType.Sales 
                    ? new Sales() 
                    : new Manager();

编译器会抱怨,因为即使使用类型推断,也必须将条件运算符返回的两个表达式转换为公共类型。条件运算符的两侧都必须返回兼容类型。此外,变量只能初始化为兼容类型。var关键字允许隐式类型化变量,类型仍然必须在编译时确定,不能在运行时确定。你需要使用
dynamic
。用外行的话说,你不能回答“什么类型是
userType
”,所以编译器也不能。如果要用类型替换
var
,会是什么?
var
不是
object
,但即使是,它也不会编译,因为条件运算符不允许您将不兼容的类型分配给变量。如果你想这样做,你必须使用
If
+1人们似乎忘记了你实际上可以指定一个类型,而不是一直使用
var
。你也让我走错了路,但这不起作用:(但这是:)@Rhumborl不,这与变量声明或赋值无关,因此,
var
这件事是完全不相关的。你的零钱没用。在形式
b的子表达式中?x:y
编译时类型的
x
y
必须彼此隐式转换(在一个方向上)。目前没有这些对象派生的基类。谢谢你的解释。