简体   繁体   中英

C# Covariance in Classes Implementing Common Interface

A WPF program I'm writing in C# has the following interface on the back-end:

public interface CatalogMenu<T> : CatalogItem where T : CatalogItem
{
    void AddCatalogItem(T toAdd);
    void RemoveCatalogItem(T toRemove);

    List<T> AvailableCatalogItems { get; }
}

I have three classes that implement the interface, each with a different T. The problem is that I want to create a List<CatalogMenu<CatalogItem>> to bind to a ListView, but this property in the View-Model doesn't compile... (thing1, thing2, and thing3 all implement the interface with a different T)

public List<CatalogMenu<CatalogItem>> MenuCategories
    {
        get
        {
            return new List<CatalogMenu<CatalogItem>>(){
                ModuleCatalog.thing1, 
                ModuleCatalog.thing2, 
                ModuleCatalog.thing3 
            };
        }
    }

As much as I'd like it to, the compiler won't let me treat the "classes implementing CatalogMenu<T> where T is a CatalogEntity" as a " CatalogMenu<CatalogItem> ". I want to present each class implementing the interface to the user through a common interface.

If I left out any details, be a little patient with me; my head's spaghetti after reading about covariance for the last 30 minutes in an attempt to figure out a way to fix this.

.Net does not support covariant classes .

If you add an ICatalogMenu<out T> , you will be able to cast any CatalogMenu to ICatalogMenu<CatalogItem> and put it into a List<ICatalogMenu<CatalogItem>>

You can accomplish the same effect using an ordinary non-generic interface or base class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM