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
必须彼此隐式转换(在一个方向上)。目前没有这些对象派生的基类。谢谢你的解释。