8

首先,对于过多的通用名称类感到抱歉。我的雇主很偏执,我确信他在这个网站上漫游。好的,所以我有这个代码:

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

但是,如果我在类的开头删除 using 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。

NOTE.- 编辑以澄清集合是哪个具体的 IEnumerable,对此感到抱歉。

4

2 回答 2

4

这很奇怪。

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

我唯一能想到的是,您的项目中可能以某种方式将“引用”弄乱了,并且您可能同时引用了“System.Core 3.5”和“System.Core 3.5.0.1”(人为的示例) ..在这种情况下你会得到这样的错误,但是,我不知道为什么System.Linq.Enumerable.ElementAt(otherEntity.OneCollection有效 - 它应该报告同样的问题。

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

于 2013-04-08T08:31:06.703 回答
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)
 }
于 2013-04-08T08:21:56.323 回答