2011-02-13 4 views
1

우선 제목이 좋지는 않지만 그 문제는 내가 내 질문을 설명하는 방법조차 모른다는 것을 알고 있습니다. 아래에서 예를 보여 드리겠습니다.타입 추론 질문 : 일반 메소드 비 일반적인 메소드에 대한 인수

EDIT : 내가 더 좋은 예를 제시 했어야합니다. 다시 시도해 보도록하겠습니다.

나는 그것이 가능하다는 것을 알고 있으며, 나는 이런 식으로 한 것을 어떻게 든 기억하지 않는다고 믿습니다. 누군가?

나는 이것이 Reflection을 통해 수행 할 수 있다는 것을 이미 알고 있으므로 이러한 솔루션을 건너 뛰십시오. - 감사합니다. T 아무것도 (컴파일러 오류가 실제로 cannot convert from 'out T' to 'out string'이다)이 될 수

답변

2

이 가능하지 않다, 다만 string 또는 int.

그냥 대중 FooprivateFoo 과부하 노출과 함께 할, 당신은 string 또는 int (모두 봉인하고, 제네릭 형식 제약 조건이 인터페이스 또는 비를 필요로하는 일반을 제한 할 수 없기 때문에 다른 방법이 없습니다 밀폐 된 클래스).

편집 (변경 질문)

자원 구현은 매개 변수가없는 생성자가있는 경우, 나는이 (응축 예) 사용합니다 : 그들은 휴 ... 그러나 매개 변수가 필요하면

interface IHostProvider 
{ 
    void Get<T> (out T result) where T : IHost, new(); 
} 

public interface IHost 
{ 
} 

public class Something : IHost 
{ 
} 

public class Provider : IHostProvider 
{ 
    public void Get<T> (out T result) where T: IHost, new() 
    { 
     result = new T(); 
    } 
} 

을, 이 밤늦게까지 생각하지 마라. 처음에는 정적 팩토리 메소드를 염두에 뒀지 만 인터페이스에서 정적 메소드를 요구하거나 추상으로 표시 할 수 없기 때문에이 방법도 작동하지 않습니다.

+0

예제 코드를 좀 더 실용적인 예제로 업데이트했습니다. 그것을보고 어떤 방식 으로든 대답을 바꾸는 지 확인하십시오. 이 문제를 해결하기 위해 여기에 도움이되거나 최소한 "좋은 프로그래밍"방법이 필요합니다. – gplusplus

0

견본이 나에게 불가능한 것처럼 보입니다. 컴파일러는 알려진 실제 매개 변수 유형에서 메서드의 형식 인수를 유추 할 수 있습니다. 예를 들면 다음과 같습니다.

void DoSomething<T>(T item) 
{ 
    ... 
} 

IFoo foo = default(IFoo); 
DoSomething(foo); // void DoSomething<IFoo>(IFoo item); 

그러나 컴파일러는 반대가 아닙니다. 컴파일러는 T의 실제 유형을 추측 할 수 없기 때문에 적용 가능한 메소드 오버로드를 선택할 수 없습니다.

void DoSomething(IFoo foo) 
{ 
    ... 
} 

T item = default(T); 
DoSomething(item); // won't compile unless it is known that T is IFoo (where T : IFoo)