2016-03-01 7 views
3

Я заметил, что массив, в C#, реализует ICollection<T>. Как массив может реализовать общий интерфейс контейнера, но не быть общим? Можно ли нам сделать то же самое?Arrays vs Generic in C#

Редактировать: Я также хотел бы знать, как массив не является общим, но он принимает любой тип и имеет тип безопасности.

public class ListOfStrings : IList<string> 
{ 
... 
} 

Это отличный пример, который демонстрирует, что мы можем создать не-дженериков от общего (спасибо MarcinJuraszek !!). Эта коллекция будет зависеть от строк. Я предполагаю, что это не имеет ничего общего с объявлением типа универсального значения строки и является некоторой внутренней проводкой, с которой я не знаком.

Еще раз спасибо!

+0

Массивы уже являются общими - 'int []' определяет массив типа 'int'. Поскольку это встроенный тип, я бы предположил, что существует синтаксический сахар, по существу, «Array » (обратите внимание, что 'Array' отличается от' [] '- это просто пример) – Rob

+0

Это имеет смысл и это действительно поможет мне подумать об этом в будущем! int [] ~ Array Maderas

ответ

6

Да, это вполне возможно. Вы можете объявить что-то вроде этого:

public class MyListOfStrings : IList<string> 
{ 
} 

и до тех пор, как вы реализуете все свойства/методы IList<string> требует от вас все будет работать нормально. Как видите, MyListOfStrings не является общим.

Вы также должны помнить, что массивы являются особыми типами, и с ними происходит куча вещей, которые не происходят с обычными пользовательскими типами. Некоторые из них описаны на MSDN, и та часть, которая, как представляется, связаны с вашими вопросами здесь:

Начиная с .NET Framework 2.0, Array класс реализует System.Collections.Generic.IList<T>, System.Collections.Generic.ICollection<T> и System.Collections.Generic.IEnumerable<T> общие интерфейсы. Реализации предоставляются массивам во время выполнения, и в результате общие интерфейсы не отображаются в синтаксисе объявления для класса Array. Кроме того, нет никаких эталонных тем для членов интерфейса, которые доступны только путем литья массива в общий тип интерфейса (явные реализации интерфейса). Ключевым моментом, который следует учитывать при создании массива на одном из этих интерфейсов, является то, что элементы, которые добавляют, вставляют или удаляют элементы, выбрасывают NotSupportedException.

Как вы можете видеть Array реализует IList<T>, ICollection<T> и IEnumerable<T> особым образом, и это не то, что вы можете сделать с вашим собственным типом.

+1

Я не знаком с этикетом здесь. Я хотел бы прояснить что-то в своем вопросе, но я не хочу, чтобы это казалось, будто вы не ответили на мой вопрос. Я просто редактирую или спрашиваю здесь? Речь идет о том, что массив принимает любой тип, но MyListOfStrings принимает только строки. Как они сделали массив не общим, но приняли любой тип? Спасибо за редактирование, кстати. – Maderas

+1

Не стесняйтесь обновлять свой вопрос с помощью этого разъяснения. – MarcinJuraszek

+0

@RyanWoods В общем случае, если редактирование отменяет существующие ответы, вероятно, лучше всего либо уточнить в комментариях (если это незначительные изменения), либо задать новый вопрос. Имейте в виду, однако, что постоянное разъяснение вопроса в комментариях рассматривается с понижением - и в этот момент, вероятно, должен быть новый вопрос. – Rob