2010-05-20 3 views
11

(나 자신이 체크 아웃,하지만 나는 아직 VS2010을 (없는))가 C# 4.0 튜플 공변

내가이 기본 인터페이스가 말 : 실현

IBaseModelInterface 
IBaseViewInterface 

그리고 2 인터페이스를 그 :

ISubModelInterface : IBaseModelInterface 
ISubViewInterface : IBaseViewInterface 

나는 Tuple<IBaseModelInterface, IBaseViewInterface> 내가 설정하려는 정의하면 그 Tuple<ISubModelInterface, ISubViewInterface>를 반환하는 공장의 결과에 따라.

C# 3에서는 하위 인터페이스가 기본 인터페이스를 인식하더라도이 작업을 수행 할 수 없습니다. 그리고 이제 공진을 허용하기 위해 in 키워드로 정의 되었기 때문에 C# 4에서 IEnumerable<IBaseModelInterface>을 사용하는 경우이 작업을 수행 할 수 있습니다. 그럼 Tuple 내가 이것을 할 수 있습니까?

내가 이해하는 바에 따르면, 공분산은 인터페이스에만 허용되므로 ITuple<T1, T2> 인터페이스가 있어야한다는 의미입니까? 이것이 존재합니까?

+3

"in"키워드는 * 공분산 *이 아닌 * 반동 *을 허용합니다. * a T가 IEnumerable *에서 나왔기 때문에 IEnumerable 은 * out *으로 표시됩니다. –

답변

12

Tuple은 클래스 (음, 클래스 계열)입니다. 정의에 따라 변하지 않습니다. 나중에 언급했듯이 인터페이스 및 대리자 형식 만 .NET 4의 일반적인 분산을 지원합니다.

내가 알고있는 ITuple 인터페이스가 없습니다. 튜플은 불변이므로 API의 값을 "꺼내"얻을 수 있기 때문에 공변 (covariant)이 될 수 있습니다.

+0

TBaseView에서 TBaseView의 내 IMyTuple을 정의 할 수 있다고 생각합니다. – RichK

+1

@RichK - 고유 한 튜플 클래스를 작성하려는 경우 BCL 튜플을 통해 제공되는 비교 및 ​​동등 의미를주의 깊게 검사해야합니다. 내장 클래스에서 제공하는 것과 동일한 동작을 유지하려고한다고 가정합니다. 일부 동작은 명확하지 않습니다. – LBushkin

+2

@ 존 스키켓, 논리적 인'ITuple' 인터페이스가 있지만 내부에 있습니다. – smartcaveman

8

튜플에서 상속하여 자신 만의 공변량 튜플을 만들 수 있습니다. 이렇게하면 자신의 평등 논리를 다시 작성하지 않아도됩니다.

public interface ICovariantTuple<out T1> 
{ 
    T1 Item1 { get; } 
} 
public class CovariantTuple<T1> : Tuple<T1>, ICovariantTuple<T1> 
{ 
    public CovariantTuple(T1 item1) : base(item1) { } 
} 

public interface ICovariantTuple<out T1, out T2> 
{ 
    T1 Item1 { get; } 
    T2 Item2 { get; } 
} 
public class CovariantTuple<T1, T2> : Tuple<T1, T2>, ICovariantTuple<T1, T2> 
{ 
    public CovariantTuple(T1 item1, T2 item2) : base(item1, item2) { } 
} 

etc.... for 3, 4, 5, 6, 7, 8 items 

컴파일 실패

Tuple<Exception> item = new Tuple<ArgumentNullException>(null); 

컴파일 성공

ICovariantTuple<Exception> item = new CovariantTuple<ArgumentNullException>(null); 

There is no base Tuple after 8 items

,하지만 충분합니다.

+0

나는 인터페이스와 동반자 클래스로 당신의 솔루션을 좋아합니다! 그러나 빈 공장의 목적은 무엇입니까? 마지막 두 예제는 정확하게 작동하는지 아닌지를 보여줍니다. – MEMark