Преобразование типов в массивах
От: Cynic Россия  
Дата: 24.08.15 12:35
Оценка:
Читаю тут Рихтера о преобразовании типов в массивах (кому интересно C# via CLR Четвертое издание Глава 16 раздел "Casting Arrays"). В первом же абзаце написано:

For arrays with reference type elements, the CLR allows you to implicitly cast the source array’s element type to a target type. For the cast to succeed, both array types must have the same number of dimensions, and an implicit or explicit conversion from the source element type to the target element type must exist. The CLR doesn’t allow the casting of arrays with value type elements to any other type.

Написал вроде четко, ну как только начал экспериментировать оказалось, что это только так кажется.
Во-первых, насколько я понял (и примеры в книге это подтверждают) речь идет только о преобразовании типов ссылок, а не типов самих элементов массивов.
Во-вторых, речь идет только о преобразованиях поддерживаемых компилятором, а не определенных пользователем, т.е. по сути это касается только преобразований между типами в одной иерархии наследования.
В общем то мне нужно ответы на два вопроса:
  1. Правильно ли я всё понял?
  2. Существует ли способ преобразовать типы элементов двух массивов каким либо более менее автоматическим способом, а не путем написание кода метода выполняющим такое преобразование?
Последний вопрос поясню примером:
class Class1 {}

class Class2
{
    public static implicit operator Class2(Class1 other) { ... }
}

...

Class1[] arr1 = new Class1[5];
//заполняем массив arr1
Class2[] arr2 = arr1;   //здесь имеется ввиду не присваивание ссылок, а копирование элементов массива


p/s: За последний вопрос грязью не бросаться, это я так на всякий случай спросил. Мало ли чего там разработчики фреймворка могли натворить.
:)
Re: Преобразование типов в массивах
От: Sharov Россия  
Дата: 24.08.15 13:11
Оценка:
Здравствуйте, Cynic, Вы писали:

C>Во-первых, насколько я понял (и примеры в книге это подтверждают) речь идет только о преобразовании типов ссылок, а не типов самих элементов массивов.


C>Правильно ли я всё понял?


Угу.

C>Во-вторых, речь идет только о преобразованиях поддерживаемых компилятором, а не определенных пользователем, т.е. по сути это касается только преобразований между типами в одной иерархии наследования.

C>В общем то мне нужно ответы на два вопроса:
C>

    C>
  1. Правильно ли я всё понял?
    C>
  2. Существует ли способ преобразовать типы элементов двух массивов каким либо более менее автоматическим способом, а не путем написание кода метода выполняющим такое преобразование?
    C>
C>Последний вопрос поясню примером:
C>
C>class Class1 {}

C>class Class2
C>{
C>    public static implicit operator Class2(Class1 other) { ... }
C>}

C>...

C>Class1[] arr1 = new Class1[5];
C>//заполняем массив arr1
C>Class2[] arr2 = arr1;   //здесь имеется ввиду не присваивание ссылок, а копирование элементов массива
C>


Я так понимаю, что автоматически будет работать только для иерархий класса -- см. тут.
Кодом людям нужно помогать!
Re[2]: Преобразование типов в массивах
От: Cynic Россия  
Дата: 24.08.15 13:58
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Я так понимаю, что автоматически будет работать только для иерархий класса -- см. тут.


Не не будет:
       string[] arr1 = new string[1];
       arr1[0] = "Test";

       object[] arr2 = new object[1];

       Console.WriteLine(arr2.GetType().Name);       //Object[]

       arr2 = arr1;

       Console.WriteLine(arr2.GetType().Name);       //String[]
       Console.WriteLine(arr2[0].GetType().Name);    //String

Вот кстати у меня попутно ещё один вопрос родился, когда я делаю так:
       Console.WriteLine(arr2.GetType().Name);       //Object[]

Это что значит, что ссылка имеет тип Object[] или сама ссылка вообще не имеет типа, а просто ссылается на объект типа Object[]?
:)
Отредактировано 24.08.2015 14:06 Cynic . Предыдущая версия . Еще …
Отредактировано 24.08.2015 14:00 Cynic . Предыдущая версия .
Re: Преобразование типов в массивах
От: GlebZ Россия  
Дата: 26.08.15 18:11
Оценка:
Здравствуйте, Cynic, Вы писали:

C>
...
C>//заполняем массив arr1
C>Class2[] arr2 = arr1;   //здесь имеется ввиду не присваивание ссылок, а копирование элементов массива
C>

C>p/s: За последний вопрос грязью не бросаться, это я так на всякий случай спросил. Мало ли чего там разработчики фреймворка могли натворить.
Ессно нет. Для различного копирования есть различные методы у самого Array но более мощно — LINQ. Например — arr2=arr1.Select(x=>(Class2)x).ToArray(); Там же есть метод Cast.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.