문제

하고 싶은 일이 이상할 수도 있지만 하한값이 0보다 큰 배열을 .Net에서 만들어야 합니다.처음에는 다음을 사용하여 가능한 것 같습니다.

Array.CreateInstance(typeof(Object), new int[] {2}, new int[] {9});

원하는 결과(하한이 9로 설정된 객체 배열)를 생성합니다.그러나 생성된 배열 인스턴스는 더 이상 예상되는 다른 메서드에 전달될 수 없습니다. Object[] 나에게 다음과 같은 오류가 발생했습니다.

System.Object[*] 에 캐스팅할 수 없습니다. System.Object[].배열 유형의 차이점은 무엇이며 이를 어떻게 극복할 수 있습니까?

편집하다:테스트 코드 =

Object x = Array.CreateInstance(typeof(Object), new int[] {2}, new int[] {9});
Object[] y = (Object[])x;

다음과 같이 실패합니다."'System.Object[*]' 유형의 개체를 'System.Object[]' 유형으로 캐스팅할 수 없습니다."

나는 또한 이 접근법에 주목하고 싶다. 하다 여러 차원을 사용할 때 작동합니다.

Object x = Array.CreateInstance(typeof(Object), new int[] {2,2}, new int[] {9,9});
Object[,] y = (Object[,])x;

잘 작동합니다.

도움이 되었습니까?

다른 팁

한 쪽에서 다른 쪽으로 던질 수 없는 이유는 이것이 악하기 때문입니다.

object[5..9]의 배열을 만들고 이를 object[]로 함수 F에 전달한다고 가정해 보겠습니다.

함수는 이것이 5..9 인지 어떻게 알 수 있습니까?F는 일반적인 배열을 기대하지만 제한된 배열을 얻고 있습니다.알 수 있다고 말할 수 있지만 이는 여전히 예상치 못한 일이며 사람들은 간단한 배열을 사용할 때마다 모든 종류의 경계 확인을 수행하고 싶어하지 않습니다.

배열은 프로그래밍에서 가장 간단한 구조이므로 너무 복잡하게 만들면 사용할 수 없게 됩니다.아마도 다른 구조가 필요할 것입니다.

당신이 해야 할 일은 당신이 원하는 동작을 모방하는 제한된 컬렉션인 클래스입니다.이렇게 하면 해당 클래스의 모든 사용자가 무엇을 기대하는지 알 수 있습니다.

class ConstrainedArray<T> : IEnumerable<T> where T : new()
{
    public ConstrainedArray(int min, int max)
    {
        array = new T[max - min];
    }

    public T this [int index]
    {
        get { return array[index - Min]; }
        set { array[index - Min] = value; }
    }

    public int Min {get; private set;}
    public int Max {get; private set;}

    T[] array;

    public IEnumerator<T> GetEnumerator()
    {
        return array.GetEnumarator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return array.GetEnumarator();
    }

}

왜 이것이 Object[]로 전달될 수 없는지 잘 모르겠지만, 배열을 래핑하고 거기에서 "이상한 논리"를 처리하는 실제 클래스를 생성한다면 쉽지 않을까요?

클래스에 "지능"을 추가할 수 있다면 실제 참조 개체를 사용하면 이점을 얻을 수 있습니다.

편집하다:어레이를 어떻게 캐스팅하고 있습니까? 코드를 더 게시할 수 있습니까?감사해요.

하한값을 const 오프셋 정수에 저장하고 소스가 인덱스로 반환하는 값에서 해당 값을 뺍니다.

또한:이것은 오래된 VB6 기능입니다.지원하는데 도움이 되는 속성이 있지 않을까 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top