2011-11-02 3 views
1

다른 클래스를 사용하는 클래스가 있는데이 클래스는 초기 클래스의 어떤 인스턴스가 해당 클래스를 소유하고 있는지 (즉 문제가 있음) 알아야합니다. 예를 들어 보겠습니다. :이 푸대로 작동하지 않습니다인터페이스 및 제네릭을 사용하는 양방향 참조

public interface IFoo<T> 
{ 
} 

public interface IBar 
{ 
    IFoo<IBar> Foo { get; set; } 
} 

public class Foo<T> : IFoo<T> where T : IBar, new() 
{ 
    private readonly T _bar; 
    public Foo() 
    { 
     _bar = new T {Foo = this}; 
    } 
} 

class Bar : IBar 
{ 
    public IFoo<IBar> Foo { get; set; } 
} 

=이 작동하지 않습니다 - 나는 IFoo이를 캐스팅해야 할 (컴파일을하지만, 런타임에 실패 할) 경우에도 마찬가지입니다. 코드를 여러 가지 방법으로 조정하려고 시도했지만 작동하는 구현을 찾지 못했습니다.

바라는 바에 따르면 내가하고 싶은 일을 볼 수있을 것입니다. -)

답변

4

.

첫째, 당신은 Foo<T> 생성자에 깁스를 삽입해야합니다

_bar = new T {Foo = (IFoo<IBar>)this}; 

그냥하지만, 그걸로 부족하고. T : new()이라는 제약 조건은 T이 구체적인 클래스 여야 함을 의미합니다. 따라서 IFoo<T>은 정확히 IFoo<IBar>이 아닙니다. 당신이 IBar<T>에 대한 일반 매개 변수 T이 공변로 지정하는 경우에는 다음 IFoo<Bar> IFoo<IBar>에의 캐스트는 법적 될 것입니다 :

public interface IFoo<out T> 

out 키워드가 지정하는 매개 변수는 기본적으로이 매개 변수 것 "을 의미합니다 (공변입니다 메소드에 의해서만 출력되고 절대 입력되지 않습니다. ")

This MSDN article은 공분산 및 반공립에 대한 자세한 정보를 제공합니다.

+0

그 트릭을 했어! 문제를 해결하고 새로운 것을 배웠습니다. 나쁘지 않아 고마워! –

2

IFoo의 유형 매개 변수 T을 공변량으로 선언하면 문제가 해결됩니까?
이 코드는 당신이하려고하는 일을 할 수 있도록해야합니다 : 당신은 일반적인 매개 변수에 대한 공분산에와 C# 4.0 지원에 따라, 생성자에서 명시 적 캐스트의 조합으로이 문제를 해결할 수

public interface IFoo<out T> { 
} 

public interface IBar { 
    IFoo<IBar> Foo { get; set; } 
} 

public class Foo<T> : IFoo<T> where T : IBar, new() { 
    private readonly T _bar; 
    public Foo() { 
     _bar = new T { Foo = (IFoo<IBar>)this }; 
    } 
} 

class Bar : IBar { 
    public IFoo<IBar> Foo { get; set; } 
} 

public static class Program { 

    public static void Main(params string[] args) { 
     Bar b = new Bar(); 
     Foo<Bar> f = new Foo<Bar>(); 
    } 

} 
+0

매력있는 일 : –

관련 문제