2010-06-21 4 views
1

변환기를 메서드에 전달하려면 변환기에서 항상 인수를 문자열로 가져와야합니다. 나는 다음을 시도하지만, 컴파일되지 않습니다 : 함수의 서명이 일반적인 인수 또는 제네릭 형식 매개 변수에 인수를 전달해야 할 때마다, 해당 유형의 매개 변수는 메소드 선언과의 일부 여야합니다변환기 전달 방법 (일반 인수에는 적용되지 않는 제약 조건)

class Test 
{ 
    public void Foo(string val, Converter<Tin,Tout> conv) 
     where Tin:string 
    { 
     myObj = conv(val); 
    } 
} 
+0

@ codemanix - 나는 항상 문자열이 될 때 Tin에 대한 제네릭 형식 제약 조건을 추가하여 복잡하다고 생각합니다. 내 대답을 보면 네가 한 일을 정확하게 할 수있을거야. – GenericTypeTea

답변

1

메소드는 제네릭 자체가됩니다.

특히 구속하려는 제네릭 형식 인수는 Foo의 메서드 서명의 일부 여야합니다. 무의미한

class Test 
{ 
    public void Foo<Tout>(string val, Converter<string, Tout> conv) 
    { 
     myObj = conv(val); 
    } 
} 
+1

그럴 게 컴파일. 문자열은 제약 조건으로 사용할 수 없습니다. – GenericTypeTea

+0

Helloooooooooooooooooo !!!! (GenericTypeTea가 나를 이기기도합니다!) – leppie

+0

이제 문자열이 유효한 제약 조건이 아니며 인터페이스 또는 비 - 봉합 클래스 만 적용 가능함을 알려줍니다. – codymanix

1

귀하의 코드 :

은이 방법을 사용해보십시오.

where Tin:string은 유효하지 않습니다. 이 문제를 해결하고 메소드에 제네릭 매개 변수를 추가하십시오.

+0

그것에 대해 무의미한 무엇입니까? 그것이 컴파일되지 않는다는 사실 외에, 이것은 질문의 일부입니다. 난 항상 문자열을하지만 아무것도 반환 할 수있는 방식으로 변환기를 제한하고 싶습니다. – codymanix

+1

@ codemanix - Converter가 첫 번째 매개 변수로 문자열을 가져올 수있을 때 왜 문자열로 제한해야합니까? – GenericTypeTea

+0

@codemanix :'string' 만 가능하면'string'을 사용하지 않는 것이 어떻습니까? 그것은 다른 어떤 것도 할 수 없습니다 .... 처음에는 '주석'에 대한 일반적인 매개 변수가 필요 없습니다. 위의 @GenericTypeTea의 대답을 참조하십시오. – leppie

2

틴이 항상 문자열이 될 경우 제약 조건은 무엇입니까?

class Test 
{ 
    public void Foo<Tout>(string val, Converter<string,Tout> conv) 
    { 
     myObj = conv(val); 
    } 
} 

는 그냥 Tin 유형을 없애하고 Converterstring를 사용합니다. 네가 지나치게 복잡하게 생각하는 것 같아.

generic constraintsealed class이므로 문자열을 사용할 수 없습니다. string에서 상속받을 수있는 것이 없으므로 완벽한 의미를 갖습니다. 그렇다면 string에 대한 제약 조건을 추가하는 이유는 무엇입니까?

e.e. 당신이 문자열에서 상속 할 수 있다면 :

public SuperString : string 

그런 다음 당신은 제약 조건으로 string을 사용하고 TinSuperString를 통과 할 수있다. 그러나 당신은 수 없다 stringsealed class입니다. 그러므로 Tin에 전달할 수있는 유일한 객체는 String입니다.

덕분에 Tin을 제거하고 위에서 작성한 코드를 사용할 수 있습니다.