2013-11-01 3 views
0

함수 매개 변수에 기본값을 추가 할 수 있도록 T의 입력을 제한하는 방법이 있습니까?일반 함수 매개 변수의 기본값 사용

public class Identity<T> 
{ 
    public readonly T Seed; 
    public readonly T Increment; 

    public Identity(T seed = 1, T increment = 1) 
    { 
     Seed = seed; 
     Increment = increment; 
    } 
} 

그것은 아마 (

+0

비슷한 추상 질문을하면 도움이 될 것 같은 느낌이다. http://stackoverflow.com/questions/3140666/where-t-multiple -Classes 나는 이것을 어떻게 다른 방식으로 사용할 수 있을지 모르지만, 이것을 어떻게 사용하는지 보지 않고 취할 수있는 모양을 정확히 말하기는 어렵습니다. 어쩌면 IKeyField 같은 것을 구현할 것인가? –

+1

이것은 중복 된 것이 아닙니다! OP는 일반 클래스의 매개 변수 정의에서 ** 기본값 **을 사용할 수 있기를 원합니다! 사실, 지적 된 부분적 질문은 부분적으로 "T는 숫자로 제한 할 수 없기 때문에"할 수 없다고 대답하지만, "충분히 중복 된"것은 아닙니다. – quetzalcoatl

+0

@quetzalcoatl 질문은 또한 "T를 할 수 있고 T를 소수, int, long과 같은 10 진수가 아닌 숫자로 제한 할 수 있기를 원합니다"라고 말합니다. 주어진 기본 인수가 현명 할 수 있도록하려면이 작업을 수행해야합니다. . – Servy

답변

0

실제 문제가 있다는 것입니다 ... 내가 할 수있을 어쩌면 긴 짧은, INT, 같은 비 진수 숫자 유형에 T를 제한 할 T seed = 1입니다) 당신이 지정할 수있는 것보다 당신이 (내가 기억 해달라고) 그것을 할 수 경우 T 타입의 매개 변수에 대한 기본값을 지정하는 데 전혀 방법이 없습니다 ..

:

T param1 = null  // for T: class 
T param1 = default(T) // for T: any 
// T param1 = new T() // for T: new() -- cannot be possible, see Servy's comment 

제네릭 형식 매개 변수 T에 사용할 수있는 다른 "생성자"가 없기 때문에!

는 컴파일러는 아무 작업도없이 생성자와 where 조항 및/또는 항상 object에서 상속받은 사람에 의해 지정된 이외의 캐스트/변환이없는 개체로 T을 처리합니다. 위의 작업/요구 사항 만 지정할 수 있기 때문에 할 수 없다고 생각합니다.

public void Add(T parent = default(T)) 
{ 
    .... 
} 
:

당신은 컴파일 시간에 평가 될 수 있으며, T. 한 예로 모든 가능한 값으로 변환 할 수 있습니다 "기본"값을 설정할 수 있습니다

default

+0

기본값은 * 리터럴 *이어야합니다. 나열된 처음 두 옵션은 리터럴이므로 괜찮 으면 작동합니다 ('null'은 형식이 null 허용 가능하며 클래스 제약이 있음). 세 번째는 그렇지 않으므로 그렇지 않습니다. 'T'에 할당 할 수있는 다른 리터럴은 없지만 어떤 것이 추가되면 기본 인수에 대한 스펙을 변경할 필요가 없습니다. – Servy

+0

감사합니다! 그것은 사실입니다. 제가 매우 일반적인 용어로 생각할 때 저는 그것에주의를 기울이지 않았습니다. 당신의 설명에 대해 메모 해드립니다. – quetzalcoatl

0
사용 ) 제네릭하지 C++ 템플릿입니다

"0"을 "마법"케이스로 취급하고 "1"로 취급하지 않는 한, 귀하의 경우에는 작동하지 않습니다. 하지만 T를 숫자 값으로 제한하지 않고 어떻게 구현할 것인가? (당신도 generics로 할 수 없다)