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

本文关键字:三元 条件 初始化 var | 更新日期: 2023-09-27 18:27:04

此代码:

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

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

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

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

编辑:@Tim Schmelter,我没有看到那个帖子,我能找到的只有intnullboolnull:

无法确定条件表达式的类型,因为';字符串';和';System.DBNull';

无法确定条件表达式的类型,因为';int';并且<空>

无法确定条件表达式的类型,因为';int';和'<空>#39;

但没有自定义类型。

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

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

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

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

因为:

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

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

您需要显式声明userTypeSalesManager的公共类型。例如,如果它们都源自User,则执行以下操作:

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