[Mono-devel-list] Code that works in Mono - but not in .NET...

Tom Shelton tom at mtogden.com
Sat Feb 28 00:54:14 EST 2004


Thanks, Ben.  I appreciate your response.

Tom

On Friday 27 February 2004 05:54 am, Ben Maurer wrote:
> Hello,
>
> This is a very interesting bug. The behavior of Microsoft is actually
> pretty logical. The code would really have to look like this:
>
> foreach (object obj in InnerList)
> {
>     if (value == null && obj == null)
>         // found
>
>     if (obj == null)
>         continue;
>     if (obj.Equals(value))
>     {
>         ....
>     }
> }
>
> Which is a pain.
>
> I filed this as http://bugzilla.ximian.com/show_bug.cgi?id=54927
>
> -- ben
>
> >>> Tom Shelton <tom at mtogden.com> 02/27/04 01:36 AM >>>
>
> I have a case of some code I wrote using Mono, that doesn't work properly
> under .NET.  I thought maybe you guys would like to know about it, as it
> seems to be a difference in implementation of the ArrayList class...
>
> Basically, what I have created is a typed collection class that inherits
> from System.Collections.CollectionBase.   The type that is stored in this
> collection has overriden Object.ToEquals to look something like this:
>
> public class Column
> {
> 	.....
>
> 	public override bool ToEquals(object obj)
> 	{
> 		if (obj is Column)
> 		{
> 			return (obj.ToString() == this.ToString());
> 		}
> 		else if (obj is string)
> 		{
> 			return ((string) obj == this.ToString());
> 		}
> 		else
> 		{
> 			return false;
> 		}
> 	}
>
> }
>
> In my ColumnCollection class,  I was implementing overloaded versions of
> the indexer, Contains, IndexOf, Remove, etc. that can take either another
> Column, or a string.  This works beautifully under Mono...
>
> public class CollumnCollection : System.Collections.CollectionBase
> {
> 	....
>
> 	public int IndexOf (Column value)
> 	{
> 		return this.InnerList.IndexOf(value);
> 	}
>
> 	public int IndexOf (string value)
> 	{
> 		return this.InnerList.IndexOf(value);
> 	}
>
> 	etc...
> }
>
> When, I would do
>  ColumnCollection columns = new ColumnCollection();
>
> columns.Add(new Column("TABLE", "FIELD"));
> ....
>
> Column col = new Column("TABLE", "FIELD");
> Console.WriteLine(columns.Contains(col));
> Console.WriteLine("TABLE.FIELD");
>
> the output, would be:
> True
> True
>
> This does not work on .NET - what I get is:
> True
> False
>
> In stepping through the code this morning, I found that in .NET my .Equals
> method is never called.  What I believe (no, I didn't look at the IL - I
> guess I should of), is that .NET is doing a sequence something like this
> when you call Contains, IndexOf, etc... (value is the object your looking
> for...)
>
> foreach (object obj in InnerList)
> {
> 	if (value.Equals(obj))
> 	{
> 		.....
> 	}
> }
>
> Where, as Mono seems to be doing something like this (and I think this is
> the more sensible approach by the way...)
>
> foreach (object obj in InnerList)
> {
> 	if (obj.Equals(value))
> 	{
> 		....
> 	}
> }
>
> I fixed these string methods easily enough - I just did my own loop, rather
> then delegate to the InnerList.  But, I thought I would point out this
> simple little inconsistency.
>
> Tom
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list



More information about the Mono-devel-list mailing list