2012-10-30 4 views
2

: 두 방법은 같은 매개 변수를 사용하기 때문에제네릭 메서드 서명을 해결하는 동안 제약 조건을 고려합니까? 이 가정

public class GenericMethods 
{ 
    public T Method<T>() where T : struct 
    { 
     // Do something specific to a struct 
    } 

    public T Method<T>() where T : class 
    { 
     // Do something specific to a class 
    } 
} 

는, 컴파일시에 어떻게 든 유효하지 않습니다. 그러나 제약 조건들이 상호 배타적이기 때문에 두 가지 방법이 충돌 할 순간이 정말로있을 것입니까? 소프트웨어가 두 가지 방법 중 하나를 선택할 수 없다는 T를 해결하는 동안 가능할 수 있습니까?

제네릭 형식이 구조체 또는 클래스 인 경우 다른 이름과 매개 변수가있는 두 가지 일반 메서드를 만드는 방법은 무엇입니까?

답변

4

번호 제한은 고려되지 않습니다. 반환 유형도 마찬가지입니다. 이것은 컴파일되지 않으며 합법적 인 C#이 아닙니다.

이것은 C# 언어 사양 3.6에 설명되어

방법의 서명 구체적 반환형, 가장 오른쪽의 매개 변수에 대해 지정 될 수있다 PARAMS 개질제를 포함하지 않으며 선택적 형식 매개 변수 제약 조건.

두 가지 방법은 "논리적"별개 동안, 그리고 충돌 제약으로 가 호출되고있는 명확하고 C# 언어가이 기능을 지원하지 않습니다해야 할 수 있습니다. 언어 디자이너는 이것이 C#에 대한 규칙을 구현하기 위해 선택한 방식이라고 결정했습니다.

+0

당신은 모든 것을 읽지 않았습니다. 나는 그것이 유효하지 않다는 것을 안다, 나는 그것이 컴파일되지 않는다는 것을 안다. – LightStriker

+0

@ Marc-AndréJutras 두 가지 버전을 만들 수는 없지만 컴파일러는 실제로 이것을 보지 않으며 런타임에서 지원하지 않습니다. 그것이 이론적으로 가능할 수 있지만 * 이런 식으로 쓰여질 수는 있지만, 그렇지 않았습니다. –

+0

그래서 "제네릭 형식이 구조체 또는 클래스 인 경우 다른 이름과 매개 변수의 두 가지 일반 메서드를 만드는 방법은 무엇입니까?" 불가능하다, 그렇지? – LightStriker

-1

그리고 당신은 또한

public MyClass Method<T>() 
    { 
     // Do something specific to a myclass 
    } 

같은 방법은 그래서 컴파일러는 명확한 선택을하지 않았을 수도 있습니다.

+0

컴파일러가 반환 형식을 메서드 서명에 고려하지 않았다고 생각했습니다. – LightStriker

관련 문제