0

私はこのシンプルなコードで1時間以上立ち往生しています...クラスはほとんどありません...そして次のようなメソッドがあります:

abstract class ClassBase<SampleInterface> {//Some methods};

public class ClassAction1: ClassBase<MyInterface> {//Some methods};

public class ClassAction2: ClassBase<MyInterface> {//Some methods};

class SomeClass
{ 
    public void AddClassRange(ICollection<ClassBase<MyInterface>> range)
    {
        foreach (ClassBase<MyInterface> ClassBase in range)
            AddClass(ClassBase);
    }


    public void AddClass(ClassBase<MyInterface> behavior)
    {
        // Something
    }
}

今、私はこれらのコードを別のクラスで使用しようとしています:

var arg1 = new ClassAction1 {//Something};
var arg2 = new ClassAction2 {//Something};

//try1
sampleElement.AddClassRange(new [] { arg1 });   // works fine

//try2
sampleElement.AddClassRange(new [] { arg2 });   // works fine

try1とtry2を組み合わせたい:

// Something like this (try3)
sampleElement.AddClassRange(new [] { arg1, arg2 });   // Error
Error : No best type found for implicitly typed array

私が思うに、try1とtry2では、ランタイムは渡されたパラメーターに基づいてtypeforキーワードを決定しています。newただし、try3では、パラメーターのタイプが異なり、ランタイムtypenewキーワードに最適なものを決定できません。

ありがとう。さらに情報が必要な場合はお知らせください。

4

2 に答える 2

3

暗黙的に型指定された配列は、配列要素の型がいずれかの要素の正確なコンパイル時型である場合にのみ機能します。つまり、コンパイラは要素タイプのセットを候補タイプのセットとして扱い、他のすべてのタイプを暗黙的に変換できるタイプの1つを正確に見つけようとします。

あなたの場合、候補型のセットはとでClassAction1ありClassAction2、どちらも暗黙的に他に変換可能ではありません-これがコンパイラエラーが発生する理由です。したがって、目的の要素タイプを明示的に指定する必要があります-おそらくClassBase<MyInterface>

sampleElement.AddClassRange(new ClassBase<MyInterface>[] { arg1, arg2 });

または、要素のいずれかまたは両方をキャストできます。

sampleElement.AddClassRange(new[] { (ClassBase<MyInterface>) arg1, arg2 });
于 2011-12-26T13:31:23.540 に答える
2

ただ行う:

sampleElement.AddClassRange
   (new [] { arg1 as ClassBase<MyInterface>,  arg2 as ClassBase<MyInterface>})

実際、1つの配列で異なるオブジェクトタイプを持つことはできません。ClassBase<MyInterface>最後にSomeClassにタイプのオブジェクトがあるため、ケースでは同じオブジェクトタイプにキャストする必要があります。したがって、にキャストする必要がありますClassBase<MyInterface>。最初のサンプルでは、​​このキャストは暗黙的に実行できますが、2番目のサンプルでは実行できません。

于 2011-12-26T13:27:38.173 に答える