public interface I {
}
public class A : I {
}
コンパイラは明示的に次のIEnumerable<A>
ように受け取りますIEnumerable<I>
。
public void Test() {
IEnumerable<A> a = new List<A>();
new List<I>().AddRange(a);
}
しかし、一般的な制約を使用すると、次のようになります。
public void Test<T>() where T : I {
IEnumerable<T> t = new List<T>();
new List<I>().AddRange(t);
}
^^^
Argument 1: cannot convert from 'IEnumerable<T>' to 'IEnumerable<I>'
ただし、これは正常にコンパイルされます。
public void Test<T>(T t) where T : I {
new List<I>().Add(t);
}
したがって、質問: これは正しい動作ですか、それともバグですか?