次のC#コードがコンパイルされない理由を理解できません。
ご覧のとおり、静的なジェネリックメソッドSomething with a IEnumerable<T>
parameter(and T
is constrained to an IA
interface)があり、このパラメーターは暗黙的に次のように変換できません。IEnumerable<IA>
。
説明は何ですか?(回避策を探すのではなく、なぜそれが機能しないのかを理解するためです)。
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
エラーが発生しましSomething2(bar)
た:
引数1:「System.Collections.Generic.List」から「System.Collections.Generic.IEnumerable」に変換できません
T
参照タイプに制限されていません。この条件を使用すれば、where T: class, IA
動作するはずです。リンクされた回答に詳細があります。
Something2(foo);
直接言うだけでも状況を再現できます。周りに行く.ToList()
取得することList<T>
(T
(これを理解する必要がない一般的な方法で宣言されたあなたのタイプのパラメータである)List<T>
ですIEnumerable<T>
)。