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

时间:2014-10-20 09:17:17

标签: c# ternary-operator

此代码:

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

给我这个编译器错误消息:

  

由于存在,因此无法确定条件表达式的类型   没有隐式转换' Models.Sales'和' Models.Manager'。

为什么我不能根据条件的结果初始化var?或者我在这里做错了什么?

编辑:@Tim Schmelter,我没有看到那篇文章,我找到的只有intnullboolnull

Type of conditional expression cannot be determined because there is no implicit conversion between 'string' and 'System.DBNull'

Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and <null>

Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and '<null>'

但没有自定义类型。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

Because

  

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

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

答案 2 :(得分:1)

您需要明确声明userTypeSalesManager的常见类型。例如,如果它们都来自User,那么请执行以下操作:

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