2012-03-17 2 views
0

나는 covariance and contravariance 배열 유형, 위임 유형 및 제네릭 형식 인수에 대한 암시 적 참조 변환을 가능하게, C#에서 읽은. 내가 궁금하네요공분산 및 Contravariance 익명 유형

나는 (클래스 유형의 객체에서 직접 파생되는) 익명 유형에 대한 공분산 및 contravariance를 사용하고 어떻게 작동 것이라고 할 수 있습니까?

답변

7

익명 형식의 일반 인터페이스 및 대리인의 공분산 및 반공립을 사용할 수 있습니까?

예. 익명 유형은 참조 유형입니다. 분산은 참조 유형에서만 작동합니다.

어떻게 ?

인터페이스 공분산 :

var sequenceOfAnonymous = from c in customers select new {c.Name, c.Age}; 
var sequenceOfObject = (IEnumerable<object>)sequenceOfAnonymous; 

배열 공분산 :

var arrayOfAnonymous = sequenceOfAnonymous.ToArray(); 
var arrayOfObject = (object[]) arrayOfAnonymous; 

당신이 제네릭 형식 추론 트릭을 사용할 필요가 위임 공분산을 보여주기 위해 :

static Func<R> MakeFunc(Func<R> f) { return f; } 
... 
var funcOfAnonymous = MakeFunc(()=>new { X = 123 }); 
var funcOfObject = (Func<object>)funcOfAnonymous; 

인터페이스 contravariance 요구를 약간 다른 트라이 CK :

interface IFrobber<in T> { void Frob(T t); } 
class Frobber<T> : IFrobber<T> 
{ 
    public void Frob(T t) { Console.WriteLine(t); } 
} 
... 
static IFrobber<T> FrobByExample<T>(IFrobber<T> frobber, T example) 
{ return frobber; } 
... 
var frobberOfObject = new Frobber<object>(); 
var frobberOfAnonymous = FrobByExample(frobberOfObject, new { X = 0 }); 

와 유사하게 위임 contravariance을 위해 : 예에 의해 주조

static Action<A> ActionByExample<A>(Action<A> action, A example) 
{ return action; } 
... 
var actionOfObject = (Action<object>) x => { Console.WriteLine(x); } 
var actionOfAnonymous = ActionByExample(actionOfObject, new { X = 0 }); 

만들기 의미?

+0

감사합니다! 좋은 예가 있으며 의심의 여지가 없습니다. – Turbot