【问题标题】:C# initialize var depending on ternary condition [duplicate]C#根据三元条件初始化var
【发布时间】:2014-10-20 09:17:16
【问题描述】:

这段代码:

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>'

但没有自定义类型。

【问题讨论】:

  • 编译器会抱怨,因为即使您使用类型推断,可以从条件运算符返回的两个表达式也必须可转换为通用类型。
  • 条件运算符的两边都必须返回兼容的类型。此外,变量只能初始化为兼容类型。 var 关键字允许隐式类型化变量,类型仍然必须在编译时确定,不能在运行时确定。您需要为此使用dynamic
  • 用外行的话来说——你不能回答“userType是什么类型”这个问题,所以编译器也不能。如果用类型替换var,会是什么类型?
  • var 不是 object,但即使是它也不会编译,因为条件运算符不允许您将不兼容的类型分配给变量。如果你想这样做,你必须使用if

标签: c# ternary-operator


【解决方案1】:

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

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

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

【讨论】:

  • 目前没有派生这些对象的基类。谢谢你的解释。
【解决方案2】:

Because:

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

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

【讨论】:

    【解决方案3】:

    您需要将userType 显式声明为SalesManager 的通用类型。例如,如果它们都派生自 User,则执行以下操作:

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

    【讨论】:

    • +1 人们似乎忘记了您实际上可以指定类型而不是一直使用var
    • 你也让我走错了路,但这不起作用:dotnetfiddle.net/QdkQ3A(但这样做:dotnetfiddle.net/aSCcfG
    • @Rhumborl 不,这与变量声明或赋值无关,所以var 的事情完全无关紧要。你的改变将无济于事。在b ? x : y 形式的子表达式中,xy 的编译时类型必须可以相互隐式转换(在一个方向上)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2021-01-28
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多