Tuesday 15 April 2014

c# - IComparer child as a generic param could not be used in Sort -



c# - IComparer<T> child as a generic param could not be used in Sort -

got stuck trying sort list<> in c#.

i have interface type implementation class:

public interface iroom { // ... } public class room : iroom { // ... }

and base of operations class comparers:

public abstract class roomcomparer : icomparer<iroom> { public roomcomparer() { } public abstract int compare(iroom x, iroom y); }

and 2 children:

public class standardmultipliedsquaremeterscomparer : roomcomparer { public standardmultipliedsquaremeterscomparer() { } public override int compare(iroom a, iroom b) { // ... } } public class squaremeterscomparer : roomcomparer { public squaremeterscomparer() { } public override int compare(iroom a, iroom b) { // ... } }

now, here's problems begin: got generic class hotel list of room instances:

public class hotel<troom, tcomparer> : ihotel, ienumerable<troom> troom : iroom tcomparer : roomcomparer, new() { public list<troom> rooms; protected tcomparer comparer; public hotel(troom[] rooms) { rooms = new list<troom>(); rooms.addrange(rooms); comparer = new tcomparer(); rooms.sort(comparer); } }

and here's problem - got 2 errors on line rooms.sort(comparer);:

error cs1502: best overloaded method match `system.collections.generic.list.sort(system.collections.generic.icomparer)' has invalid arguments (cs1502)

error cs1503: argument #1' cannot converttcomparer' look type `system.collections.generic.icomparer' (cs1503)

i tried many different solutions, no result. what's happening?

note: using mono 3.10.0 on ubuntu

you're trying utilize generic contravariance (if comparer can compare 2 troom values, should able compare 2 iroom values), usually fine - when troom known class type. can prepare requiring troom reference type:

where troom : class, iroom

at point, contravariance works fine, , well. require room types genuinely classes, of course.

do need hotel generic this? seems little much overkill me...

c# sorting generics mono

No comments:

Post a Comment