Covariance in generic collections I have a some classes and interface

public interface IGeoObject
    {
        GeoCoordinate GetGeocoordinate();
    }

public class User : IGeoObject
    {
        public GeoCoordinate GetGeocoordinate()
        {
            //...
            return GeoCoordinate;           
        }
    }  

public class Venue : IGeoObject
    {    
        public GeoCoordinate GetGeocoordinate()
        {
            //...
            return GeoCoordinate;
        }
    }

public class Place : IGeoObject
    {    
        public GeoCoordinate GetGeocoordinate()
        {
            //...
            return GeoCoordinate;
        }
    }


I have, example variable users with type List&lt;User&gt;

And I have method with signature 

double GetMinDistance(List&lt;IGeoObject&gt; objects, GeoCoordinate position)


I can't pass users to GetMinDistance, because covariance of generic types not work.

I can create additional list and use method .ConvertAll (or .CasT&lt;T&gt;):

List&lt;IGeoObject&gt; list = new List&lt;User&gt;(listUser).ConvertAll(x =&gt; (IGeoObject)x);
var dist = GeoTest.GetMinDistance(list, position);


I'm not sure that this is the most elegant solution. Most embarrassing that the caller must do this conversion.

This is similar to my problems in the architecture? There are more elegant solutions?

P.S. Long story, but I really can not give the coordinates of the same species in all classes.
You can make GetMinDistance generic:

double GetMinDistance&lt;T&gt;(IList&lt;T&gt; objects, GeoCoordinate position)
  where T: IGeoObject
{ 
    // ...
}


You can use it like this:

List&lt;User&gt; user = ....;

GetMinDistance(user, position);