Неявное преобразование массива объектов в массив int в c# - PullRequest
0 голосов
/ 21 марта 2020

Мне нравится преобразовывать массив классов в целочисленный массив. Мой класс Data такой:

public class Data
{
    public int low, high;

    ...................
    ...................

    public static implicit operator int[](Data myClass) 
    {
        int[] arr = {myClass.low, myClass.high};
        return arr;
    }
}

В этом class у меня есть implicit оператор преобразования , так что класс можно преобразовать в целочисленный массив .

Я создаю объект списка классов Data и преобразую список в int 2D-массив следующим образом -

 public int[][] Merge(int[][] intervals) {
    List<Data> list = new List<Data>();

    ............
    ............

    return list.Cast<int[]>().ToArray();
}

Затем я получаю эту ошибку-

System.InvalidCastException: Specified cast is not valid.
at (wrapper castclass) System.Object.__castclass_with_cache(object,intptr,intptr)
Line 0: System.Linq.Enumerable+&lt;CastIterator&gt;d__34`1[TResult].MoveNext () in &lt;59093ef301a24e5a91cb0295fb832cca&gt;
Line 0: System.Collections.Generic.LargeArrayBuilder`1[T].AddRange (System.Collections.Generic.IEnumerable`1[T] items) in &lt;59093ef301a24e5a91cb0295fb832cca&gt;
Line 0: System.Collections.Generic.EnumerableHelpers.ToArray[T] (System.Collections.Generic.IEnumerable`1[T] source) in &lt;59093ef301a24e5a91cb0295fb832cca&gt;
Line 0: System.Linq.Enumerable.ToArray[TSource] (System.Collections.Generic.IEnumerable`1[T] source) in &lt;59093ef301a24e5a91cb0295fb832cca&gt;
Line 58: Solution.Merge (System.Int32[][] intervals) in Solution.cs
Line 21: __DriverSolution__.__Helper__ (System.Int32[][] param_1) in __Driver__.cs
Line 37: __Driver__.Main (System.String[] args) in __Driver__.cs
[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidCastException: Specified cast is not valid.
at (wrapper castclass) System.Object.__castclass_with_cache(object,intptr,intptr)
Line 0: System.Linq.Enumerable+&lt;CastIterator&gt;d__34`1[TResult].MoveNext () in &lt;59093ef301a24e5a91cb0295fb832cca&gt;
Line 0: System.Collections.Generic.LargeArrayBuilder`1[T].AddRange (System.Collections.Generic.IEnumerable`1[T] items) in &lt;59093ef301a24e5a91cb0295fb832cca&gt;
Line 0: System.Collections.Generic.EnumerableHelpers.ToArray[T] (System.Collections.Generic.IEnumerable`1[T] source) in &lt;59093ef301a24e5a91cb0295fb832cca&gt;
Line 0: System.Linq.Enumerable.ToArray[TSource] (System.Collections.Generic.IEnumerable`1[T] source) in &lt;59093ef301a24e5a91cb0295fb832cca&gt;
Line 58: Solution.Merge (System.Int32[][] intervals) in Solution.cs
Line 21: __DriverSolution__.__Helper__ (System.Int32[][] param_1) in __Driver__.cs
Line 37: __Driver__.Main (System.String[] args) in __Driver__.cs

Может кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 21 марта 2020

Полагаю, исключение не имеет значения, и, возможно, оно было сгенерировано до того, как код достигнет Cast<int[]>(), но я вижу, что даже код может достигать Cast<int[]>, есть ошибка InvalidCastException.

Оператор - это трюк с компилятором.

int[] array = new Data();

Вышеописанное работает, потому что компилятор заменяет правый операнд = вызовом метода для метода оператора.

int[] array = Data.op_Implicit(new Data());

Когда вы используете Cast<T>, у вас нет компилятора, который помог бы вам в выполнении вышеизложенного, поэтому оператор вообще не будет вызываться.

Чтобы иметь возможность привести, вам нужно использовать метод Select и явное приведение как это:

int[][] array = list.Select(x => (int[])x).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...