2014-09-19 8 views
0

에 배열이 다른 동작을하는 방법이 궁금합니다.이 배열은 모두 IList를 구현합니다.이 배열은 IList의 비 공변 성을 나타냅니다 (IList<out T>으로 정의되지 않음) IList<IPerson>에 할당 할 때 아래 예제에서 'people3'을 제외한 모든 할당은 ok입니다. personArray의 'people4'의 경우 할당이 작동하는 이유는 무엇입니까?IList에 할당 할 때 배열의 공변 동작

public interface IPerson { } 
public class Person : IPerson { } 

var personList = new List<Person>(); 
var personArray = new Person[0]; 

IList<Person> people1 = personList; 
IList<Person> people2 = personArray; 
IList<IPerson> people3 = personList; 
IList<IPerson> people4 = personArray; 
+0

[하지 * 완전히 * 중복 (http://stackoverflow.com/questions/3516619/why을 제공

 object[] myArray = new string[1]; myArray[0] = 1; 

런타임 오류를 제공합니다 -are-c-sharp-arrays-covariant-and-what-benefits-does-it-bring) 그래서 나는 망치질 않을 것입니다. – Rawling

+1

어떻게 든 관련 질문을 찾기위한 나의 시도는 그 하나를 놓쳤습니다 – CRice

+0

http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array- covariance.aspx는 다음과 같이 설명합니다 ... – CRice

답변

1

그것은 공분산의 종류가 좋지 않아서 C#이 Java가 지원하기 때문에 배열에서만 지원합니다.

이것은 컴파일시 에러

 List<object> myList = new List<string>(1); 
     myList[0] = 1; 
+0

당신은 그것이 가능한 '런타임 할당 오류 때문에 순전히'나쁜 것 '이라고 생각합니까? 그렇지 않으면 호환 하위 클래스/기본 클래스의 경우 무료 동작을 좋아합니다. – CRice

+0

원래 예제에서 List 을 만들었습니다. List 으로 만들려면 원래대로해야합니다. 목록을 으로 변환하면 Person이 아닌 다른 것을 목록에 추가 할 수 있습니다. 이는 컴파일 타임에리스트와 함께, 그리고 런타임에 배열로 예방됩니다. 실제로 더 이상 유연성이 없습니다. – Dallas

+0

그런 경우 이제 목록 , IReadOnlyList , IReadOnlyCollection 을 사용하려고합니다. :) – CRice

0

T:U 경우 T[]에 인스턴스 IList<U>에 캐스트 할 수 있지만, IList<T>.IsReadOnly이 거짓이 될 것이다에도 불구하고, IList<U>.IsReadOnlytrue를 반환합니다. IList<U>.IsReadOnlytrue을 반환하더라도 쓰기중인 특정 항목이 T을 만족할 경우 IList<U>에 쓰려는 시도는 계속 성공할 수 있습니다. U에 의해 식별 된 특정 인스턴스가 시도하고 예외가 발생하는지 관찰하지 않고 ILIst<T>에 저장 될 수 있는지 여부를 확인하는 방법은 없습니다.