Почему свойство С# Arresys IsSerializable имеет значение True?

Мне было просто интересно, почему массивы С# возвращают true для своего свойства IsSerializable. Массивы не имеют атрибута Serializable, и они также не реализуют интерфейс ISerializable, поэтому почему свойство IsSerializable установлено на true?

Когда я пытаюсь выполнить приведенный ниже код, он выводит "True" в консоли:

Console.WriteLine (new string[0].GetType().IsSerializable);

Вывод:

True

Попробуйте в Интернете

Моя версия среды .NET - 3.5.

Ответы

Ответ 1

Arrays не имеет атрибута Serializable, а также не реализует ISerializable interface

Array класс, неявный базовый класс массивов С#, имеет [SerializableAttribute]:

[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Array : ICloneable, IList, ICollection, 
    IEnumerable, IStructuralComparable, IStructuralEquatable

(ссылка)

Также представляется, что компилятор добавляет [SerializableAttribute] к самому типу массива

foreach (var a in typeof(string[]).GetCustomAttributes(false)) {
    Console.WriteLine(a); // Prints "System.SerializableAttribute"
}

Передача false в GetCustomAttributes гарантирует, что возвращаются только атрибуты этого класса, а не его базовые классы.

Демоверсия