2010-12-18 5 views
10

명시 적으로 제네릭 매개 변수 형식을 제공해야하는 이유 컴파일러에서 형식을 유추해야하는 이유는 무엇입니까?명시 적으로 제네릭 매개 변수 형식을 제공해야하는 이유 컴파일러에서 형식을 유추해야하는 이유는 무엇입니까?

public static T2 Cast<T1,T2>(this T1 arg) where T2 : class where T1 : class 
{ 
    return arg as T2; 
} 

샘플 사용법 : 더 지능적인 컴파일러 내 원하는 용도에 비해

objOfTypeT2 = objOfTypeT1.Cast<TypeT1,TypeT2>(); 


:

objOfTypeT2 = objOfTypeT1.Cast<TypeT2>(); 

또는 어쩌면 내가해야 더 지능 :-)

주의 사항 : 반환 유형. 나는 함수를 호출 한 객체를 제공하지 않으려합니다. 메서드는 확장 메서드입니다.

+0

.Cast().To<Type2>() 

함으로써 : 예를 들어, 코드 허용에 쓸 수 있을까? –

+1

왜 그냥 public static T를 만들지 않는가? (이 객체 값) {return value to T;}? – Rauhotz

+0

@Rauhotz 당신이 언급 한 것을 가지고 있었는데, 호기심과 또 다른 과부하를 찾아 내서 값 유형을 사용할 수있게 만들었습니다. 왜냐하면 제네릭 제약으로 과부하를 만들 수 없기 때문입니다. –

답변

11

제네릭 메서드에 대한 형식 매개 변수 유추가 all 또는 nothing으로 제한됩니다. 부분 추론은 할 수 없습니다.

이론적 근거는 아마도 형식 유추 규칙을 단순화하는 것입니다.이 유추 규칙은 너무 과중한 규칙을 고려해야하기 때문에 이미 꽤 복잡합니다.

+0

추측 했으므로 매개 변수의 순서를 변경하여 추론 된 유형이 마지막 매개 변수가되지만 기회는 없습니다. –

+0

@Jani : 주문은 중요하지 않습니다. 컴파일러가 모든 형식 인수를 유추 할 수 있습니다.이 경우 모든 인수를 생략 할 수도 있고 적어도 하나만 유추 할 수도 있습니다. 후자의 경우에는 항상 * all *을 명시 적으로 지정해야합니다. –

15

유추는 반환 형식을 고려하지 않습니다. 그러나 당신은 generics를 분리하려고 시도 할 수 있습니다. (가, 나타내는 유일한 검증되지 않은) 정상적인 방법 (들)을 주조 잘못 무엇

public static CastHelper<T> Cast<T>(this T obj) { 
    return new CastHelper<T>(obj); 
} 
public struct CastHelper<TFrom> { 
    private readonly TFrom obj; 
    public CastHelper(TFrom obj) { this.obj = obj;} 
    public TTo To<TTo>() { 
     // your code here 
    } 
} 
+0

반환 유형을 제공합니다. 내가 함수를 호출 한 객체를 제공하지 않으려는 경우, 메소드는 확장 메소드입니다. –

+0

@Jani 예제를 살펴 보겠습니다. from 유형을 포함하지 않습니다. 그냥 대상 유형. –

+0

그래, 그게 유일한 해결책이라고 말할 수 있습니다. –

관련 문제