使用Linq调用是一个模糊的错误

时间:2013-04-08 08:08:30

标签: c# linq visual-studio-2008 resharper

首先,对于过分的通用名称类抱歉。我的雇主是偏执狂,我肯定知道他漫游这个网站。好的,我有这个代码:

var fooObj = new MyFooClass()
{
    fooField1 = MyEnum.Value3, 
    fooField2 = false,
    fooField3 = false,
    fooField4 = otherEntity.OneCollection.ElementAt(0) as MyBarClass
}

其中,otherEntity.OneCollection是一个ISet。 ISet是一个实现IEnumerable的NHibernate集合类。如果我尝试编译此代码,我会收到此错误:

Error 2     The call is ambiguous between the following methods or properties: 
'System.Linq.Enumerable.ElementAt<MyFirm.Blah.Blah.ClassyClass>    (System.Collections.Generic.IEnumerable<MyFirm.Blah.Blah.ClassyClass>, int)'
and 
'System.Linq.Enumerable.ElementAt<MyFirm.Blah.Blah.ClassyClass>(System.Collections.Generic.IEnumerable<MyFirm.Blah.Blah.ClassyClass>, int)'    

但是如果我在类的开头删除使用System.Linq并将代码更改为:

var fooObj = new MyFooClass()
{
    fooField1 = MyEnum.Value3, 
    fooField2 = false,
    fooField3 = false,
    fooField4 = System.Linq.Enumerable
                     .ElementAt(otherEntity.OneCollection, 0) as MyBarClass
}

它编译和工作。 (?运算符检查OneCollection是否为了清晰起见而删除了元素)

有人可以向我解释这个错误吗?

如果相关:我正在使用Visual Studio 2008,目标是.NET Framework 3.5并使用ReSharper 5.1。

注意 - 编辑以澄清哪个具体的IEnumerable是集合,对不起。

2 个答案:

答案 0 :(得分:3)

这很奇怪。

该错误声称两个完全相同的签名之间存在歧义。

我唯一能想到的是你可能会以某种方式将“引用”搞砸在你的项目中,也许你可以参考'System.Core 3.5'和'System.Core 3.5.0.1'(设计的例子)..在这种情况下你会得到这样的错误,但是,我想不出为什么System.Linq.Enumerable.ElementAt(otherEntity.OneCollection有效 - 它应该报告同样的问题。

..或者你可能以某种方式让你的'OneCollection'以某种邪恶的方式实现IEnumerable两次?但是,我认为错误信息会有所不同。

答案 1 :(得分:1)

要删除含糊不清的引用,您必须更明确。有两种选择。

首先,你可以使你的IEnumerable通用,如:

IEnumerable<MyFooClass> = new List<MyFooClass>();
...
var fooObj = new MyFooClass()
{
     fooField1 = MyEnum.Value3, 
     fooField2 = false,
     fooField3 = false,
     fooField4 = otherEntity.OneCollection.ElementAt(0) as MyBarClass
 }

或者第二;如果它是非通用的IEnumerable,请执行强制转换:

IEnumerable = new List<MyFooClass>();
...
var fooObj = new MyFooClass()
{
     fooField1 = MyEnum.Value3, 
     fooField2 = false,
     fooField3 = false,
     fooField4 = otherEntity.OneCollection.Cast<MyFooClass>().ElementAt(0)
 }