2015-03-14 5 views
1

Есть ли способ иметь несколько типов структуры в списке, используя метод, описанный для классов here?Несколько типов структур в одном списке

Отсносящийся на один ответ, который сказал, чтобы наследовать от абстрактного класса (не представляется возможным для структур) или интерфейса я пришел с этим:

public interface IMemorable {} 

public struct Memorable<type> : IMemorable where type : struct 
{ 
    private type Data; 

    public Memorable<type> (type data) 
    { 
     Data = data; 
    } 
} 

и внедрение Перечислите этот путь:

List<Memorable> memorables; 
memorables.Add (new Memorable<someStruct>()); 
memorables.Add (new Memorable<otherStruct> (new otherStruct (6, "Six"))); 

Который должен работать, поскольку он работает с классами и Структуры действительно поддерживают наследование интерфейсов, я думаю?

Я получаю эту ошибку, хотя:

Assets/Test.cs(51,22): error CS0305: Using the generic type `Memorable<T>' requires `1' type argument(s) 

В декларации Список Line

Или вы можете привести меня в какой-то лучшее решение ... Что касается производительности, то я, вероятно, нужно хранить несколько тысяч этих структур. Я не уверен, что в случае, если такой подход каким-то образом будет работать, классы, наследующие от абстрактного класса, будут лучше подходят ...

Можете ли вы дать мне совет?

+0

* why * Вы хотите сделать это?Я уверен, что есть другие способы решения ваших проблем с производительностью. – BrokenGlass

+0

Обратите внимание, что сохранение структур как интерфейса полностью разрушает любое преимущество в производительности, которое вы могли бы снимать, поскольку будет храниться только ссылка на экземпляр в штучной упаковке. – BrokenGlass

+0

. Как вы думаете, используя классы с абстрактный класс, поскольку база была бы лучше? : | Я делаю тест времени выполнения :) – Seneral

ответ

2

Да (с некоторыми небольшими поправками), но это было бы бесполезно:

public interface IMemorable {} 

public struct Memorable<T> : IMemorable where T : struct 
{ 
    private T Data; 

    public Memorable(T data) 
    { 
     Data = data; 
    } 
} 

List<IMemorable> memorables = new List<IMemorable>(); 
memorables.Add(new Memorable<someStruct>(new someStruct())); 
memorables.Add(new Memorable<otherStruct>(new otherStruct(6, "Six"))); 

(Обратите внимание, что обычно общие типы называются TSomething (T и S в верхнем регистре))

Потому что тогда все, что у вас есть, это IMemorable, что вы не можете использовать для доступа к T Data.

Я добавлю, что в общем случае struct (и все типы значений) и интерфейсы не смешиваются хорошо, потому что приведение struct к интерфейсу вызывает его бокс (и, следовательно, создание копии структуры) , с единственным исключением (это не имеет значения здесь)

+0

Спасибо, но я должен был отметить мою ошибку, которая все еще появляется ... – Seneral

+0

Отличный ответ, почему он не может получить доступ к T Data? Разве он не может делать '((Памятный ) памятные вещи [1]). – bokibeg

+0

@ Общая ваша ошибка, вероятно, появляется, потому что вам не хватает 'public Memorable (T data): this()'. – bokibeg

1

Сообщение об ошибке сообщает вам указать параметр типа T вашего класса Memorable<T> при использовании его в качестве параметра типа для объявления List<>.

Как правило, невозможно объявить список, содержащий несколько разных типов структур, если вы не объявите список, содержащий какие-либо общие родительские типы этих структур. Это будет object, System.ValueType (прямой родительский класс всех структур) или любой общий объявленный интерфейс.

Два типичных типа, которые отличаются только по своему типу, не имеют общего типа, который более специфичен, чем любые другие два типа с одним и тем же родительским классом. Другими словами, различные типы структур Memorable<T> с разными T не имеют более общего общего родителя, чем любые другие два типа структуры. Любой список, который может содержать оба из них, также может содержать по крайней мере любой другой тип структуры и только в коробке, то есть в качестве ссылок, а не значений. (Какой вид побеждает идею объявить их как структуры, если у вас нет других причин.)

+0

Спасибо, что прояснил это много :) Я думаю, мне нужно посмотреть, нужно ли мне придать тип для каждого элемента списка, когда я ищу или сравните значение равенства; Если я это сделаю, мне определенно нужно другое решение ... – Seneral

Смежные вопросы