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 を使用しています。

注.-具体的なIEnumerableがコレクションであることを明確にするために編集されました。申し訳ありません。

4

2 に答える 2

4

これは非常に奇妙です。

このエラーは、2 つの完全に同一の署名の間にあいまいさが存在することを示しています。

私が考えることができる唯一のことは、プロジェクトで何らかの形で「参照」が台無しになっている可能性があり、「System.Core 3.5」と「System.Core 3.5.0.1」の両方への参照がある可能性があるということです(不自然な例) ..この場合、このようなエラーが発生しますが、なぜ機能するのかわかりませんSystem.Linq.Enumerable.ElementAt(otherEntity.OneCollection。同じ問題が報告されるはずです。

..または、何らかの方法で 'OneCollection' に IEnumerable を 2 回実装させたのでしょうか。しかし、その後、エラーメッセージは異なると思います。

于 2013-04-08T08:31:06.703 に答える
1

あいまいな参照を削除するには、より明確にする必要があります。2 つのオプションがあります。

まず、次のように IEnumerable をジェネリックにすることができます。

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

または2番目。非ジェネリック 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 に答える