PC Review


Reply
Thread Tools Rate Thread

List(Of clsClass) = List(Of clsSubClass)

 
 
Pieter
Guest
Posts: n/a
 
      15th Jul 2008
Hi,

I have a class clsSubClass which inherits from clsClass.

When I instantiate an object of clsClass (MyClass), and I instantiate an
object from clsSubclass (MySubClass) I can do an "MyClass = MySubclass".

But when I declare two generic list of them ("Dim MyList1 as List(Of
clsClass)" and "Dim MyList2 as List(Of clsSubClass)"), I can't do an
"MyList1 = MyList2".

Why is this exactly, and is there a way to implement this behaviour?


Thanks a lot in advance,


Pieter


 
Reply With Quote
 
 
 
 
Jon Skeet [C# MVP]
Guest
Posts: n/a
 
      15th Jul 2008
On Jul 15, 9:34*am, "Pieter" <pieterNOSPAMcou...@hotmail.com> wrote:
> I have a class clsSubClass which inherits from clsClass.
>
> When I instantiate an object of clsClass (MyClass), and I instantiate an
> object from clsSubclass (MySubClass) I can do an "MyClass = MySubclass"..
>
> But when I declare two generic list of them ("Dim MyList1 as List(Of
> clsClass)" and "Dim MyList2 as List(Of clsSubClass)"), I can't do an
> "MyList1 = MyList2".


Indeed. That's because generics don't exhibit variance.

> Why is this exactly, and is there a way to implement this behaviour?


Brief answer: consider this code.
List<Banana> bananaBunch = new List<Banana>();
List<Fruit> fruitbowl = bananaBunch;
fruitbowl.Add(new Apple());

Suppose this were legal - then bananaBunch would contain an Apple,
which is clearly invalid.

For a lot of detail, see Eric Lippert's series of blog articles:
http://blogs.msdn.com/ericlippert/ar...e/default.aspx

Jon
 
Reply With Quote
 
Pieter
Guest
Posts: n/a
 
      15th Jul 2008
Oh yes indeed you're right :-S I should have thought about that :-)

Although: An Import doesn't work neither, which should work in my opnion?
Because clsSubClass is also an clsClass: it shoudl be able to import these
items...


"Jon Skeet [C# MVP]" <(E-Mail Removed)> wrote in message
news:e668d643-aa73-459a-b32c-(E-Mail Removed)...
On Jul 15, 9:34 am, "Pieter" <pieterNOSPAMcou...@hotmail.com> wrote:


 
Reply With Quote
 
Jon Skeet [C# MVP]
Guest
Posts: n/a
 
      15th Jul 2008
On Jul 15, 9:55*am, "Pieter" <pieterNOSPAMcou...@hotmail.com> wrote:
> Oh yes indeed you're right :-S I should have thought about that :-)
>
> Although: An Import doesn't work neither, which should work in my opnion?
> Because clsSubClass is also an clsClass: it shoudl be able to import these
> items...


What exactly would you expect an import to do? You just can't treat a
list of bananas as if it's a general list of fruit. You can create a
new list of fruit and copy the contents of a list of bananas into it,
of course.

Jon
 
Reply With Quote
 
Marc Gravell
Guest
Posts: n/a
 
      15th Jul 2008
Well, what are you meaning by "import"? Any example code?

One good trick here is to use a generic method; I'll use C# syntax for
[my] familiarity:

public void DoSomething<T>(List<T> list) where T : clsClass
{

}

you can now pass a List<clsClass> or a List<clsSubClass>, but you
ideally want to talk about "T" inside the method. You are saying "I
have a list of [something], where that [something] is, or is derived
from, clsClass".

Marc
 
Reply With Quote
 
Pavel Minaev
Guest
Posts: n/a
 
      15th Jul 2008
On Jul 15, 12:34*pm, "Pieter" <pieterNOSPAMcou...@hotmail.com> wrote:
> Hi,
>
> I have a class clsSubClass which inherits from clsClass.
>
> When I instantiate an object of clsClass (MyClass), and I instantiate an
> object from clsSubclass (MySubClass) I can do an "MyClass = MySubclass"..
>
> But when I declare two generic list of them ("Dim MyList1 as List(Of
> clsClass)" and "Dim MyList2 as List(Of clsSubClass)"), I can't do an
> "MyList1 = MyList2".
>
> Why is this exactly, and is there a way to implement this behaviour?


It has already been explained why it doesn't work like that, but there
are workarounds, depending on what exactly you're trying to do.
Typically, you don't want variance on variables - you want it on
function arguments. In this case, you can use generics yourself. For
example, say, you have a function that should take an arbitrary
IEnumerable(Of BaseClass). You could write it like that:

Public Sub PrintAll(items As IEnumerable(Of BaseClass)
For Each item In items ...
End Sub

But then you won't be able to pass IEnumerable(Of DerivedClass) to
this function. The workaround is to do this:

Public Sub PrintAll(Of TItem As BaseClass)(items As IEnumerable(Of
TItem))
For Each item In Items ...
End Sub

Now that the function is explicitly declared as taking IEnumerable of
_any_ TItem which inherits from BaseClass, it can take IEnumerable(Of
DerivedClass) just fine.

Unfortunately, this workaround is for covariance only; you cannot do
usage-site contravariance with it (e.g. write a method that works on
any IList(Of TItem) such that it would support method Add(BaseClass)).
 
Reply With Quote
 
Pieter
Guest
Posts: n/a
 
      15th Jul 2008
Yes but I should be able to Import a list of Bananas into a list of Fruits?
But it doesn't work?

"Jon Skeet [C# MVP]" <(E-Mail Removed)> wrote in message
news:218b3924-f208-4224-a99d-(E-Mail Removed)...
What exactly would you expect an import to do? You just can't treat a
list of bananas as if it's a general list of fruit. You can create a
new list of fruit and copy the contents of a list of bananas into it,
of course.

Jon


 
Reply With Quote
 
Pieter
Guest
Posts: n/a
 
      15th Jul 2008
Ooops: The Import function is one we created ourselves: It takes a
BaseList(Of T) as argument.

"Marc Gravell" <(E-Mail Removed)> wrote in message
news:d86ffb1e-cb46-4cd8-9d41-(E-Mail Removed)...
> Well, what are you meaning by "import"? Any example code?
>
> One good trick here is to use a generic method; I'll use C# syntax for
> [my] familiarity:
>
> public void DoSomething<T>(List<T> list) where T : clsClass
> {
>
> }
>
> you can now pass a List<clsClass> or a List<clsSubClass>, but you
> ideally want to talk about "T" inside the method. You are saying "I
> have a list of [something], where that [something] is, or is derived
> from, clsClass".
>
> Marc



 
Reply With Quote
 
Jon Skeet [C# MVP]
Guest
Posts: n/a
 
      15th Jul 2008
On Jul 15, 2:32*pm, "Pieter" <pieterNOSPAMcou...@hotmail.com> wrote:
> Ooops: The Import function is one we created ourselves: It takes a
> BaseList(Of T) as argument.


And what does it do, exactly? It's hard to say why something doesn't
work without seeing it...

Jon
 
Reply With Quote
 
SurturZ
Guest
Posts: n/a
 
      16th Jul 2008
This code should do it. MyList1 will be a different List to MyList2, but the
elements inside will be the same. Changes to the membership of MyList2 will
not be reflected in MyList1, but changes to properties of the members in each
should be:

Dim MyList1 as New List(Of clsClass)
Dim MyList2 as New List(Of clsSubClass)
....
'Copy MyList2 into MyList1
MyList1.Clear
For i As Integer = 0 To MyList2.Count -1
MyList1.Add MyList2.Item(i)
Next i

--
David Streeter
Synchrotech Software
Sydney Australia


"Pieter" wrote:

> Hi,
>
> I have a class clsSubClass which inherits from clsClass.
>
> When I instantiate an object of clsClass (MyClass), and I instantiate an
> object from clsSubclass (MySubClass) I can do an "MyClass = MySubclass".
>
> But when I declare two generic list of them ("Dim MyList1 as List(Of
> clsClass)" and "Dim MyList2 as List(Of clsSubClass)"), I can't do an
> "MyList1 = MyList2".
>
> Why is this exactly, and is there a way to implement this behaviour?
>
>
> Thanks a lot in advance,
>
>
> Pieter
>
>
>

 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Use VBA to reset data validation (=list) value to first value in that list (list is a named range) ker_01 Microsoft Excel Programming 7 27th Oct 2008 04:13 PM
Compare List A to List B, Return List B Items Not in List A zwestbrook Microsoft Excel Programming 4 18th Sep 2008 11:32 PM
List(Of clsClass) = List(Of clsSubClass) Pieter Microsoft C# .NET 10 16th Jul 2008 09:50 AM
List(Of clsClass) = List(Of clsSubClass) Pieter Microsoft VB .NET 10 16th Jul 2008 09:50 AM
Global List not Display new Secruity List and Distr List =?Utf-8?B?S2V2aW4gR2Fs?= Microsoft Outlook Contacts 2 15th Aug 2006 06:02 PM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 01:16 PM.