You need an explicit cast to make sure the compiler knows what you're
trying to do:

IComparer<U> comparer = (IComparer<U>)new ELementComparer();

Instead of:

ELementComparer comparer = new ELementComparer();

Good luck,

Paul

-----Original Message-----
From: Discussion of advanced .NET topics.
[mailto:[EMAIL PROTECTED] On Behalf Of Paul Cowan
Sent: Wednesday, January 25, 2006 15:34
To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM
Subject: Re: [ADVANCED-DOTNET] Generics Comiler error/headache

I've implemented an interface which all objects that need ordered will
implement.

I'm still having problems.

Here is a break down of my code:

I have an IOrderedChild interface:

public interface IOrderedChild
{
    int Index { get; set; }
}

A Question Element that implements IOrderedChild

public class QuestionElement : DBObjectBase, IOrderedChild
{
    public int Index { get { return _index; } set { _index = value; } }
}

I have a Set class that I reads as follows:

public class Set<T, U> : IEnumerable where T : IEnumerable, ICollection,
ISet
                                     where U : DBObjectBase,
IOrderedChild
{

    private List<U> _items;

    public Set(T list)
    {
        _items = new List<U>();
        IEnumerator listEnumerator = list.GetEnumerator();
        while (listEnumerator.MoveNext())
            _items.Add((U)listEnumerator.Current);
    }

    public Set(T list, bool sort): this(list)
    {
         ELementComparer comparer = new ELementComparer();
         _items.Sort(comparer);
    }
}

The comparer looks like this:

public class ELementComparer : IComparer<IOrderedChild>
{
    int IComparer<IOrderedChild>.Compare(IOrderedChild x, IOrderedChild
y)
    {
        return (x.Index > y.Index) ? 1 : (x.Index < y.Index) ? -1 : 0;
    }
}

This will simply not compile.  I get the cannot convert error.  I'm
going
mad.  I really wanted to derive a new class from Set that would have the
extra constraint on U and put the overloaded constructor in the derived
class.

Thanks for helping

Paul

[EMAIL PROTECTED]





>From: Ryan Heath <[EMAIL PROTECTED]>
>Reply-To: "Discussion of advanced .NET topics."
><ADVANCED-DOTNET@DISCUSS.DEVELOP.COM>
>To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM
>Subject: Re: [ADVANCED-DOTNET] Generics Comiler error/headache
>Date: Wed, 25 Jan 2006 15:13:10 +0100
>
>Hi Paul Cowan,
>
>you could also implement an IComparable<> on your QuestionElement class
>
>class QuestionElement : IComparable<QuestionElement>
>{
>...
>   int IComparable<QuestionElement>.CompareTo(QuestionElement other)
>   {
>     return Comparer<int>.Default.Compare(this.Index, other.Index);
>   }
>}
>
>by then you do not need to specify a Comparer for the items.Sort
function
>
>BTW
>there is a design flaw in your case: by using ElementComparer you are
>saying more or less that U *is* a QuestionElement (or descendant of)
>... So why is U a generic parameter?
>
>HTH
>// Ryan
>
>On 1/25/06, Paul Cowan <[EMAIL PROTECTED]> wrote:
> > U is a parameterized type I am passing into the class.
> >
> > It still will not compile.
> >
> > Thanks
> >
> >
> >
> > [EMAIL PROTECTED]
> >
> >
> >
> >
> >
> > >From: Paul van Brenk <[EMAIL PROTECTED]>
> > >Reply-To: "Discussion of advanced .NET topics."
> > ><ADVANCED-DOTNET@DISCUSS.DEVELOP.COM>
> > >To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM
> > >Subject: Re: [ADVANCED-DOTNET] Generics Comiler error/headache
> > >Date: Wed, 25 Jan 2006 13:57:23 +0100
> > >
> > >Your ElementComparar is defined for the specific type
QuestionElement,
> > >so downcasting it to the more generic type won't work.
> > >
> > >This code should compile:
> > >
> > >List<QuestionElement> _items;
> > >
> > >public Set(T list)
> > >{
> > >_items = new List<QuestionElement>();
> > >//code to load collection
> > >ElementComparer comparer = new ElementComparer();
> > >_items.Sort(comparer); //WON'T COMPILE
> > >}
> > >
> > >
> > >
> > >-----Original Message-----
> > >From: Discussion of advanced .NET topics.
> > >[mailto:[EMAIL PROTECTED] On Behalf Of Paul
Cowan
> > >Sent: Wednesday, January 25, 2006 13:49
> > >To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM
> > >Subject: [ADVANCED-DOTNET] Generics Comiler error/headache
> > >
> > >I am trying to do a custom sort on using the following comparer:
> > >
> > >public class ElementComparer : IComparer<QuestionElement>
> > >{
> > >public int Compare(QuestionElement x, QuestionElement y)
> > >{
> > >return (x.Index > y.Index) ? 1 : (x.Index < y.Index) ? -1 :
> > >0;
> > >}
> > >}
> > >
> > >I have the following code in the constructor of another object:
> > >
> > >Then in the constructor of another class, I am trying to sort on a
> > >List<U> like this:
> > >
> > >public Set(T list)
> > >{
> > >_items = new List<U>();
> > >//code to load collection
> > >ElementComparer comparer = new ElementComparer();
> > >_items.Sort(comparer); //WON'T COMPILE
> > >}
> > >
> > >The compiler error is cannot convert ElementComparer to
> > >IComparer<U>. What am I doing wrong.
> > >
> > >Thanks
> > >
> > >Paul
> > >
> > >===================================
> > >This list is hosted by DevelopMentor(r)  http://www.develop.com
> > >
> > >View archives and manage your subscription(s) at
> > >http://discuss.develop.com
> > >
> > >===================================
> > >This list is hosted by DevelopMentor(r)  http://www.develop.com
> > >
> > >View archives and manage your subscription(s) at
>http://discuss.develop.com
> >
> > ===================================
> > This list is hosted by DevelopMentor(r)  http://www.develop.com
> >
> > View archives and manage your subscription(s) at
>http://discuss.develop.com
> >
>
>===================================
>This list is hosted by DevelopMentor(r)  http://www.develop.com
>
>View archives and manage your subscription(s) at
http://discuss.develop.com

===================================
This list is hosted by DevelopMentor(r)  http://www.develop.com

View archives and manage your subscription(s) at
http://discuss.develop.com

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to