Приведение ReadOnlyCollection <derivedType>к ReadOnlyCollection <baseType> - PullRequest
5 голосов
/ 24 июня 2011

Мне было интересно, сможет ли кто-нибудь указать мне правильное направление ...

Как я могу разыграть от ReadOnlyCollection<myDerivedType> до ReadOnlyCollection<myBaseType> без повторения или "обновления" копии?

Я использую .NET Framework 4.0

Ответы [ 6 ]

10 голосов
/ 24 июня 2011

Вы можете неявно преобразовать ROC<Derived> в IEnumerable<Base> в C # 4, но не в ROC<Base>.

Это прискорбно; было бы очень хорошо иметь возможность делать ковариантные преобразования для неизменяемых типов.

1 голос
/ 24 июня 2011

Я не верю, что вы можете, так как универсальный параметр T не определен как out (как было отмечено. .Net не поддерживает ковариацию и контрастность в классах).

ReadOnlyCollection

Вы должны будете использовать LINQ, например readOnlyColl.Cast<myBaseType>();, или цикл.Внутренне LINQ будет использовать цикл / итерацию, создавая новую копию.

0 голосов
/ 24 июня 2011

Вы не можете сделать это, поэтому вам, вероятно, лучше передавать интерфейсы, такие как IEnumerable<T> или ICollection<T>, а не конкретные классы, такие как ReadOnlyCollection<T>.

Тогда вы можете сделать, как предлагали другие:

collection.Cast<myBaseType>();
0 голосов
/ 24 июня 2011

Я не думаю, что ковариация и контравариантность разрешены в C # для универсальных типов. Дженерики не поддерживают это - они инвариантны .

Я думаю, что только общие делегаты в C # 4 имеют ограниченную поддержку ковариации и контравариантности.

0 голосов
/ 24 июня 2011

Вы не можете проецировать ReadOnlyCollection<myDerivedType> в ReadOnlyCollection<myBaseType>

0 голосов
/ 24 июня 2011

с Linq

yourCollection.Cast<myBaseType>();
...