编译器无法推导出表达式类型?

时间:2013-11-08 14:59:37

标签: c# .net linq

我有以下内容:

class MyClass {
    public int? MyNullInt;
    public string MyString;
};

以及以下内容:

from it in items
select new MyClass {
  MyString = it.AString, 
  MyNullInt = (it.B == null) ? null : it.B % 2
 }

据我了解from the MSDN,结构如下:

int? test = (true) ? null : 3;

是非法的...,因为编译器无法推断出表达式类型( ??! Nullable<int>,对我来说...... )< / p>

那么,我的linq表达式中有任何解决方法吗?

3 个答案:

答案 0 :(得分:7)

只需使用int?显式转换为:

 MyNullInt = (it.B == null) ? (int?) null : it.B % 2

 MyNullInt = (it.B == null) ?  null : (int?) it.B % 2

有关详细信息,请参阅Eric Lippert's blog Type inference woes, part one

答案 1 :(得分:2)

您可以明确地将null转换为(int?)以通知编译器您的意图:

from it in items
select new MyClass {
    MyString = it.AString, 
    MyNullInt = (it.B == null) ? (int?)null : it.B % 2
}

答案 2 :(得分:2)

条件表达式的两边必须相同,因此您可以使用default(int?)代替null强制类型,如下所示:

MyNullInt = (it.B == null) ?  default(int?) : it.B % 2;

default(int?)null,但编译器知道它的类型是int?,因此编译表达式没有问题。