2015-01-29 14 views
3

는 난이 허용되는이 함수 문자열 배열 보내면 IComparableIComparable의 배열을 허용하는 함수에 int 배열을 보내는 방법은 무엇입니까?

public static void sort(IComparable[] a){//...} 

의 어레이를 수용하는 C# 1 기능을 가지고 있지만, int 배열은 구조 Int32IComparable 연장에도 허용되지 않는다.

public struct Int32 : IComparable, IFormattable, 
IConvertible, IComparable<int>, IEquatable<int> 

첫 번째 질문은 값 유형의 배열을 이러한 함수에 보낼 수없는 이유입니다.

두 번째 질문은 IComparable의 배열을 허용하는 함수에 값 유형의 배열을 보내야하는 방법입니다.

답변

7

intIComparable이지만, int[]IComparable[]이 아닙니다. 말하자면 상상해 : int[]에서 참조를 저장하려고 할 것이다

int[] x = new int[10]; 
IComparable[] y = x; 
y[0] = "hello"; 

합니다. 나쁜 상태.

기본적으로 값 유형 배열은 공변수가 아닙니다. (참조 유형 배열은 컴파일 타임에 공변이지만 실행 시간에 유효하지 않은 값을 저장하려고하면 던져 질 것입니다. 설계상의 결함입니다.)

이 문제를 해결하는 방법은 다음과 같습니다. 사용 제네릭 :

public static void Sort<T>(T[] array) where T : IComparable 

심지어 더 나은 IComparable의 일반적인 양식을 사용 : (. 당신이 CompareTo를 호출 할 때 권투를 피할 수 있습니다 그 방법)

public static void Sort<T>(T[] array) where T : IComparable<T> 

+0

@PetSerAl : 다른 이유로 실패합니다. 여전히 참조 배열이므로 실행시에는 호환되지 않을 것입니다. "값 유형 배열에서 참조를 읽을 수 없다"는 것이 무슨 뜻인지 명확하지 않습니다 - 값 유형 배열에 참조를 전혀 저장할 수 없습니다 ... –

+0

@PetSerAl : 예외를 던지지 않는다면 IComparable c = x [0];처럼 박스형의 int를 참조하는 것이 합리적 일 것이다. 그게 값 형식 배열에 대한 참조를 저장하려고 노력하는 것보다 나에게 훨씬 더 제정신이 아닐 수 있습니다. –

+0

@PetSerAl : Unboxing은 항상 명시 적입니다. 권투는하지 않습니다. 나는 당신이 더 명확한 대답을 쓸 수 있다고 생각한다면, 그렇게 함 - 나는 여기서 당신의 요지를 이해하기가 어렵다는 것을 알고 있으며, 논평은 이것을 토론하는 좋은 방법이 아님을 제안한다. –