Program Club

숫자 유형과 일치하는 일반 제약

proclub 2020. 10. 14. 21:27
반응형

숫자 유형과 일치하는 일반 제약


이 질문에 이미 답변이 있습니다.

내가 만들고있는 유창한 테스트 프레임 워크에서 사용할 숫자 유형에 대한 확장 메서드를 작성하려고합니다. 기본적으로 이렇게하고 싶습니다.

public static ShouldBeGreaterThan<T>(this T actual, T expected, string message)
    where T : int || T: double || etc...

그냥 where T : struct그도 일치하기 때문에,하지 않습니다 string그리고 bool아마도 다른 내가 잊고 뭔가를합니다. 숫자 유형 만 일치시키기 위해 할 수있는 일이 있습니까? (특히 >and <연산자 를 구현하는 유형 이므로 비교할 수 있습니다 ... 이것이 내가 날짜도 일치한다는 것을 의미하는 경우에는 실제로 중요하지 않습니다. 확장 프로그램은 여전히 ​​내가 예상 한대로 작동합니다.)


이 경우 제네릭을 IComparable인터페이스 로 제한하여 CompareTo메소드에 대한 액세스를 제공합니다. 이 인터페이스를 사용하면 질문에 답할 수 있습니다 ShouldBeGreaterThan.

숫자 유형은 해당 인터페이스를 구현하며 문자열에서도 작동한다는 사실은 그다지 신경 쓰지 않아야합니다.


where T : struct, 
          IComparable, 
          IComparable<T>, 
          IConvertible, 
          IEquatable<T>, 
          IFormattable

이것이 제가 숫자 제약에 가장 근접한 것입니다. 모든 숫자 유형은이 5 개의 인터페이스를 구현하지만 IFormattable은 bool로 구현되지 않으며 문자열은 참조 유형이므로 적용 할 수 없습니다.

예를 들어 DateTime을 구현하는 다른 것들이 있습니다. 따라서 실제로 필요한 것은 아니지만 원하지 않는 많은 인스턴스화를 방지합니다.


public static bool IsGreaterThan<T>(this T actual, T comp) where T : IComparable<T>
{
    return actual.CompareTo(comp) > 0;
}

원하는 경우 구조체 제약 조건을 추가 할 수도 있습니다.


INumeric필터로 사용하는 것과 같은 일반적인 것이 없기 때문에 숫자로만 제한하는 것은 어렵습니다 . 실제로 여기서 가장 쉬운 방법 은 제약 조건을 고집 하지 않고Comparer<T>.Default.Compare 메서드 내에서 사용 하는 것입니다.

이 내장 유형은 제네릭 IComparable<T>및 비 제네릭을 모두 IComparable지원하고 .NET을 통해 참조 유형, 값 유형 및 해제 된 사용을 지원 Nullable<T>합니다.

전체 내용은 운영자의 사용, 볼 MiscUtil의 Operator클래스GreaterThan당신이 경우에 유용 할 수있는 등 정말 (오히려 인터페이스와) 연산자를 사용하고 싶습니다. 또한 Add다른 운영자에 대한 액세스를 제공합니다 .


Stackoverflow는 이런 종류의 질문으로 가득 차 있습니다. 이 검색을보세요 . C #은 숫자로 제한되는 제네릭 형식을 정의하는 방법을 지원하지 않습니다. 슬프게도 가장 좋은 방법은 모든 개체에 확장 메서드를 구현하고 유형에 따라 전환을 수행하거나 int, double, float 등에 대한 메서드 집합을 만드는 것입니다.


이 해결 방법이 도움이 될 수 있습니다 . 정책을 사용하는 해결 방법 . 컴파일 시간 안전성을 제공합니다.

참고 URL : https://stackoverflow.com/questions/3329576/generic-constraint-to-match-numeric-types

반응형