나는 (이 예제) 다음과 같은 클래스와 확장 클래스는 한 :변환
public class Person<T>
{
public T Value { get; set; }
}
public static class PersonExt
{
public static void Process<TResult>(this Person<IEnumerable<TResult>> p)
{
// Do something with .Any().
Console.WriteLine(p.Value.Any());
}
}
나는 다음과 일하는 것이 뭔가를 쓸 수 기다리고 있었다
하지만, 아무튼 't :
var x = new Person<List<String>>();
x.Process();
List는 상속 트리에서 IEnumerable보다 하위이므로 유효하지 않아야합니까? 그것은 제가 직접 Person<IEnumerable<String>>
을 작성하면 작동합니다. 왜냐하면 그것은 직접적인 유형이기 때문입니다.
나는 .Any()
메서드를 사용해야하기 때문에 T가 IEnumerable<Something>
을 구현하는 한 Person<T>
의 모든 메서드에 적용 할 수있는 확장 메서드를 사용하려고합니다.
편집 : 아마도 공분산에 대한 이해가 꺼져 있을까요? IEnumerable<String>
은 IEnumerable<Object>
으로 변환해야하지만 IList<String>
은 IEnumerable<String>
으로 변환 할 수 없습니다.
EDIT2 : .net 4.0을 사용하여 I 은입니다.
, 사람들은 다른 개념은,'IList의는'변환이이 허용된다 그 이유는,''IEnumerable을 '를 구현 ICollection에 을'구현이 점에서 공변 또는 contravariant 수하는 것이 필요는 없습니다 케이스. –
지난 몇 분 동안 약간의 독서를 한 후에 공동/반항에 대해 이해하고 있습니다. 그렇다면 내가 왜 쓴 것이 유효하지 않은가? 그것은 직관적 인 것 같습니다 ... – TheCloudlessSky
C# 4.0에서이 작업을 수행했다면 작동 할 것이라고 추측했지만 C# 3.0 이하에서는 작동하지 않습니다. –