【问题标题】:Ternary Operator Troubles with LINQLINQ 的三元运算符问题
【发布时间】:2011-11-18 05:48:17
【问题描述】:

我在使用这条三元线时遇到了问题:

var userFromContext = IsOwner ? db.Owners.Where(o => o.UserName == username) 
                              : db.Users.Where(u => u.UserName == username);

它给了我这个错误信息:

无法确定条件表达式的类型,因为System.LINQ.IQueryable<Owners>System.LINQ.IQueryable<Users> 之间没有隐式转换。

如果我将它分配给 var 变量,它为什么要关心?

【问题讨论】:

  • 不要混淆 javascript 的 var 和 csharp 的 var。事实上,不要使用 csharp 的 var,除非必须(例如使用 anon 类型)。

标签: c# linq entity-framework linq-to-entities


【解决方案1】:

因为变量必须是某种类型。

var”并不意味着“无类型”。它的意思是“亲爱的编译器,请根据我分配给它的表达式弄清楚这个变量的类型应该是什么”。

为了做到这一点,编译器必须首先了解表达式的类型是什么,它不能这样做,因为你的三元运算符的两个分支是不同的类型。

【讨论】:

  • 啊。我在想,因为var userFromContext = db.Users.Where(u => u.UserName == username); 可以自己工作,所以在评估条件后动态确定它的类型应该不是问题。
  • @Ron,不,事实并非如此。 “var” 不是什么新的闪亮特性,而仅仅是一个捷径;一种在保持其性质不变的同时缩短代码的方法。
【解决方案2】:

三元运算符必须具有特定的通用返回类型。您可以通过将它们都转换为 IEnumberable 来解决此问题。

【讨论】:

  • 如果UserOwner 有一个共同的基本类型,这个问题会自动解决吗?如果没有,那么你可以投到IEnumerable<CommonBaseTypeBetweenOwnerAndUser>
【解决方案3】:

因为var 只是静态类型的占位符。类型 必须 在编译时知道。如果类型取决于数据,那么编译器就无法知道它是什么类型。如果您真的想使用上述构造,请使用 dynamic 关键字而不是 var:

dynamic userFromContext = IsOwner ? db.Owners.Where(o => o.UserName == username) 
                                  : db.Users.Where(u => u.UserName == username);

【讨论】:

  • 如果您使用dynamic,那么您将无法在其上使用LINQ 运算符,因为dynamic 不适用于扩展方法。
  • 没错,但我试图让结构与 OP 的原始结构相似
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
相关资源
最近更新 更多