无法从“System.Collections.Generic.IEnumerable<int>”转换为“System.Collections.Generic.IEnumerable<int?>”

kos*_*kov 0 c# linq

class first
{
    private int? firstID;
}

class second
{
    private int secondID;
    private int secondField;
}

public override Expression<Func<first, bool>> FirstFilter()
{
    Contex db = new Contex();
    List<second> list = (from p in db.second select p).ToList();

    return b => list.Select(p => p.secondID).Contains(b.firstID);
}
Run Code Online (Sandbox Code Playgroud)

我有错误:

无法从“System.Collections.Generic.IEnumerable”转换为“System.Collections.Generic.IEnumerable”

我尝试了很多不同的方法,但我只是不知道如何解决它。

dri*_*iis 5

用这个:

list.Select(p => p.secondID).Cast<int?>().Contains(b.firstID);
Run Code Online (Sandbox Code Playgroud)

您遇到了问题,因为list.Select(p => p.secondID)will 是 an IEnumerable<int?,但由于 firstID 是int(不可为空的),重载决议无法确定有效的包含要调用的重载。您不能从 隐式转换IEnumerable<int?>IEnumerable<int>。Cast 扩展方法通过将每个元素转换为 int 来工作。

正如另一个答案中提到的,您也可以简单地将不可为空的 int 传入包含:

list.Select(p => p.secondID).Contains(b.firstID ?? 0);
Run Code Online (Sandbox Code Playgroud)

但是,请注意这可能不是我们想要的。如果第一个列表包含0,并且firstID为空,则结果将为真,因为当值为空时传入 0。当firstID为空时,表达式的 Cast 版本返回假。