[c#] मैं एक सूची <derived> सूची <Base> में एक सूची क्यों निर्दिष्ट नहीं कर सकता?



1 Answers

अब यदि आप निम्नलिखित कॉल करना चाहते हैं:

List<PackageCall> calls = package.getCalls();

// select only AbstractPackageCall items
List<AbstractPackageCall> calls = calls.Select();
calls.Add(new AnotherPackageCall());

मैं इस सामान्यीकरण को बुलाता हूं।

इसके अलावा, आप इसे और अधिक विशिष्ट उपयोग कर सकते हैं:

List<PackageCall> calls = package.getCalls();

// select only AnotherPackageCall items
List<AnotherPackageCall> calls = calls.Select(); 
calls.Add(new AnotherPackageCall());

विस्तार विधि का उपयोग करके इसे कार्यान्वित करें:

public static class AbstractPackageCallHelper
{
    public static List<U> Select(this List<T> source)
        where T : AbstractPackageCall
        where U : T
    {
        List<U> target = new List<U>();
        foreach(var element in source)
        {
            if (element is U)
            {
                 target.Add((U)element);
            }
        }
        return target;
    }
}
Question

मैंने निम्नलिखित वर्ग को परिभाषित किया:

public abstract class AbstractPackageCall
    {

     ...

    }

मैं इस वर्ग के उप-वर्ग को भी परिभाषित करता हूं:

class PackageCall : AbstractPackageCall
    {

      ...
    }

AbstractPackageCall कई अन्य उपखंड भी हैं

अब मैं निम्नलिखित कॉल करना चाहता हूं:

 List<AbstractPackageCall> calls = package.getCalls();

लेकिन मुझे हमेशा यह अपवाद मिलता है:

Error   13  Cannot implicitly convert type 'System.Collections.Generic.List<Prototype_Concept_2.model.PackageCall>' to 'System.Collections.Generic.List<Prototype_Concept_2.model.AbstractPackageCall>' 

यहां क्या समस्या है? यह तरीका पैकेज # getCalls विधि है

 internal List<PackageCall> getCalls()
        {
            return calls;
        }



क्योंकि List<PackageCall> List<AbstractPackageCall> से प्राप्त नहीं होती है। आप Cast<>() एक्सटेंशन विधि का उपयोग कर सकते हैं, जैसे:

var calls = package.getCalls().Cast<AbstractPackageCall>();



Related