C # 제네릭 메서드 선택

모하 메 무사

다른 차원의 기하학적 엔터티와 함께 ​​작동 할 수있는 일반 알고리즘을 C #으로 작성하려고합니다.

다음 인위적인 예제에서는 Point2Point3둘 다 간단한 IPoint인터페이스를 구현합니다 .

이제 함수 GenericAlgorithm를 호출하는 함수가 GetDim있습니다. 유형에 따라이 함수에 대한 여러 정의가 있습니다. 를 구현하는 모든 것에 대해 정의 된 대체 함수도 있습니다 IPoint.

처음에는 다음 프로그램의 출력이 2, 3이 될 것으로 예상했지만 0, 0입니다.

interface IPoint {
    public int NumDims { get; } 
}

public struct Point2 : IPoint {
    public int NumDims => 2;
}

public struct Point3 : IPoint {
    public int NumDims => 3;
}

class Program
{
    static int GetDim<T>(T point) where T: IPoint => 0;
    static int GetDim(Point2 point) => point.NumDims;
    static int GetDim(Point3 point) => point.NumDims;

    static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim(point);

    static void Main(string[] args)
    {
        Point2 p2;
        Point3 p3;
        int d1 = GenericAlgorithm(p2);
        int d2 = GenericAlgorithm(p3);
        Console.WriteLine("{0:d}", d1);        // returns 0 !!
        Console.WriteLine("{0:d}", d2);        // returns 0 !!
    }
}

GenericAlgorithm좋습니다. 어떤 이유로 구체적인 유형 정보가 . 왜 이런 일이 발생하는지 완전히 이해하지 못하지만 괜찮습니다. 이런 식으로 할 수 없다면 다른 대안이 있습니까?

존 스키트

이 방법:

static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim(point);

... 항상을 호출 GetDim<T>(T point)합니다. 오버로드 해결은 컴파일 타임에 수행되며 해당 단계에는 다른 적용 가능한 방법이 없습니다.

실행 시간에 오버로드 해결을 호출 하려면 동적 타이핑을 사용해야합니다.

static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim((dynamic) point);

그러나 일반적으로 이것을 위해 상속을 사용하는 것이 더 좋은 생각입니다. 예를 들어, 분명히 단일 메서드와 return을 가질 수 있습니다 point.NumDims. 실제 코드에서 동등한 것이 더 까다로운 이유가 있다고 가정하지만 더 많은 컨텍스트가 없으면 상속을 사용하여 전문화를 수행하는 방법에 대해 조언 할 수 없습니다. 그래도 옵션은 다음과 같습니다.

  • 대상의 실행 시간 유형을 기반으로 한 전문화를위한 상속 (선호)
  • 실행 시간 과부하 해결을위한 동적 입력

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Typescript-제네릭 메서드 선언

분류에서Dev

C # 제네릭 메서드 값

분류에서Dev

C ++ : 제네릭 클래스의 비 제네릭 메서드?

분류에서Dev

C ++ : 제네릭 클래스의 비 제네릭 메서드?

분류에서Dev

제네릭 및 비 제네릭 메서드 간의 C # 오버로드 해결

분류에서Dev

C #의 제네릭 클래스가있는 제네릭 메서드

분류에서Dev

C #에서 C ++ 제네릭 메서드 호출

분류에서Dev

C ++ 오버로드 제네릭 메서드, 참조 및 값

분류에서Dev

C #에서 제네릭 메서드 호출

분류에서Dev

C # 메서드에서 제네릭 목록 작업

분류에서Dev

제네릭 메서드 C #에서 문자열 역 직렬화

분류에서Dev

C #에서 제네릭 메서드의 값을 얻는 방법

분류에서Dev

Java 제네릭 메서드 선언 기본 사항

분류에서Dev

C # 올바른 방법으로 제네릭 메서드 구현

분류에서Dev

유형 열거에서 선택한 제네릭 사용

분류에서Dev

TypeScript에서 클래스 제네릭을 선택적으로 만드는 방법

분류에서Dev

두 개의 제네릭 매개 변수가있는 C #의 제네릭 메서드

분류에서Dev

제네릭 C #을 사용하여 where 절을 사용한 선택

분류에서Dev

하나의 제네릭 (C #)에서 3 개의 메서드 변환

분류에서Dev

C # 메서드에서 제네릭 클래스 참조를 얻는 방법

분류에서Dev

제네릭으로 팩토리 메서드를 선언하는 방법

분류에서Dev

Objective C에서 제네릭 옵트 인

분류에서Dev

C # 제네릭 메서드에 대한 참조를 다른 메서드에 전달

분류에서Dev

제네릭 메서드와 기본 메서드를 C #으로 작성하는 방법

분류에서Dev

C #에서 제네릭 메서드 오버로드를 만드는 방법은 무엇입니까?

분류에서Dev

C # XNA에서 선택 관련 문제

분류에서Dev

제네릭 하위 클래스 메서드가 C #에서 허용 할 수있는 제한 형식

분류에서Dev

외부 스레드에서 레이블 텍스트를 변경하는 C # 제네릭 메서드입니다.

분류에서Dev

제네릭을 사용하는 ef core select 문에서 명명 된 필드 선택

Related 관련 기사

  1. 1

    Typescript-제네릭 메서드 선언

  2. 2

    C # 제네릭 메서드 값

  3. 3

    C ++ : 제네릭 클래스의 비 제네릭 메서드?

  4. 4

    C ++ : 제네릭 클래스의 비 제네릭 메서드?

  5. 5

    제네릭 및 비 제네릭 메서드 간의 C # 오버로드 해결

  6. 6

    C #의 제네릭 클래스가있는 제네릭 메서드

  7. 7

    C #에서 C ++ 제네릭 메서드 호출

  8. 8

    C ++ 오버로드 제네릭 메서드, 참조 및 값

  9. 9

    C #에서 제네릭 메서드 호출

  10. 10

    C # 메서드에서 제네릭 목록 작업

  11. 11

    제네릭 메서드 C #에서 문자열 역 직렬화

  12. 12

    C #에서 제네릭 메서드의 값을 얻는 방법

  13. 13

    Java 제네릭 메서드 선언 기본 사항

  14. 14

    C # 올바른 방법으로 제네릭 메서드 구현

  15. 15

    유형 열거에서 선택한 제네릭 사용

  16. 16

    TypeScript에서 클래스 제네릭을 선택적으로 만드는 방법

  17. 17

    두 개의 제네릭 매개 변수가있는 C #의 제네릭 메서드

  18. 18

    제네릭 C #을 사용하여 where 절을 사용한 선택

  19. 19

    하나의 제네릭 (C #)에서 3 개의 메서드 변환

  20. 20

    C # 메서드에서 제네릭 클래스 참조를 얻는 방법

  21. 21

    제네릭으로 팩토리 메서드를 선언하는 방법

  22. 22

    Objective C에서 제네릭 옵트 인

  23. 23

    C # 제네릭 메서드에 대한 참조를 다른 메서드에 전달

  24. 24

    제네릭 메서드와 기본 메서드를 C #으로 작성하는 방법

  25. 25

    C #에서 제네릭 메서드 오버로드를 만드는 방법은 무엇입니까?

  26. 26

    C # XNA에서 선택 관련 문제

  27. 27

    제네릭 하위 클래스 메서드가 C #에서 허용 할 수있는 제한 형식

  28. 28

    외부 스레드에서 레이블 텍스트를 변경하는 C # 제네릭 메서드입니다.

  29. 29

    제네릭을 사용하는 ef core select 문에서 명명 된 필드 선택

뜨겁다태그

보관