다음 C # 코드가 컴파일되지 않는 이유를 이해할 수 없습니다.
보시다시피 IEnumerable<T>
매개 변수가있는 (그리고 인터페이스로 T
제한됨) 정적 제네릭 메서드 Something이 있으며이 IA
매개 변수는 암시 적으로 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()
를 얻기 위해 돌아 다니는 것은 이것을 이해하는 데 필요하지 않습니다 (a 는 ). List<T>
T
List<T>
IEnumerable<T>