public interface IDic
{
int Id { get; set; }
string Name { get; set; }
}
public class Client : IDic
{
}
मैं कैसे डाल सकता List<Client>
करने के लिए List<IDic>
?
public interface IDic
{
int Id { get; set; }
string Name { get; set; }
}
public class Client : IDic
{
}
मैं कैसे डाल सकता List<Client>
करने के लिए List<IDic>
?
जवाबों:
आप नहीं कर सकते डाली यह (संदर्भ पहचान संरक्षण) - जो असुरक्षित हो जाएगा। उदाहरण के लिए:
public interface IFruit {}
public class Apple : IFruit {}
public class Banana : IFruit {}
...
List<Apple> apples = new List<Apple>();
List<IFruit> fruit = apples; // Fortunately not allowed
fruit.Add(new Banana());
// Eek - it's a banana!
Apple apple = apples[0];
अब तुम एक में बदल सकते हैं List<Apple>
एक करने के लिए IEnumerable<IFruit>
सहप्रसरण की वजह से नेट 4 / सी # 4 में है, लेकिन अगर आप चाहते हैं एक List<IFruit>
आप एक बनाने के लिए होगा नई सूची। उदाहरण के लिए:
// In .NET 4, using the covariance of IEnumerable<T>
List<IFruit> fruit = apples.ToList<IFruit>();
// In .NET 3.5
List<IFruit> fruit = apples.Cast<IFruit>().ToList();
लेकिन यह मूल सूची के कास्टिंग के समान नहीं है - क्योंकि अब दो अलग-अलग सूची हैं। यह सुरक्षित है, लेकिन आपको यह समझने की आवश्यकता है कि एक सूची में किए गए परिवर्तन दूसरी सूची में नहीं दिखाई देंगे । (उन वस्तुओं के लिए संशोधन जो सूचियों को संदर्भित करती हैं, निश्चित रूप से देखी जाएंगी।)
List<IFruit>
संदर्भ हो जो वास्तव में ए का संदर्भ था List<Apple>
। यदि आप उससे एक Banana
संदर्भ जोड़ते हैं तो आप क्या होने की उम्मीद करेंगे List<IFruit>
?
using
निर्देश है System.Linq
या आप इसे कॉल करने का प्रयास कर रहे हैं या नहीं, मुझे यकीन नहीं है कि आप मुझसे कैसे मदद कर पाएंगे। मेरा सुझाव है कि आप अधिक शोध करते हैं, और यदि आप अभी भी फंस गए हैं, तो आप एक न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के साथ एक प्रश्न पूछते हैं ।
कास्ट इटेटर और .टॉइलिस्ट ():
List<IDic> casted = input.Cast<IDic>().ToList()
चाल चलेगा।
मूल रूप से मैंने कहा कि सहसंयोजक काम करेगा - लेकिन जैसा कि जॉन ने ठीक ही कहा है; नहीं, यह नहीं होगा!
और मूल रूप से मैंने भी मूर्खतापूर्ण ToList()
कॉल छोड़ दिया
Cast
रिटर्न IEnumerable<T>
a, not a List<T>
- and no, covariance इस रूपांतरण की अनुमति नहीं देगा, क्योंकि यह असुरक्षित होगा - मेरा उत्तर देखें।
ToList()
था कि आपकी टिप्पणी पढ़ने से पहले गायब था; लेकिन हां, जैसा कि आपने दिखाया है कि कोवरियन काम नहीं करेंगे! रवींद्र!
Cast
.NET 4 में कॉल की आवश्यकता नहीं है , इसलिए जब तक आप टाइप तर्क को निर्दिष्ट करते हैं ToList
।
मुझे भी यह समस्या थी और जॉन स्कीट के उत्तर को पढ़ने के बाद मैंने अपने कोड को उपयोग List<T>
करने से संशोधित किया IEnumerable<T>
। हालांकि इस की ओ पी के मूल प्रश्न का उत्तर न मैं कैसे डाल सकता List<Client>
करने के लिएList<IDic>
, यह ऐसा करने के लिए आवश्यकता से बचने करता है और इस प्रकार जो दूसरों को इस मुद्दे का सामना करने के लिए सहायक हो सकता है। यह निश्चित रूप से मानता है कि कोड का उपयोग करने की आवश्यकता List<IDic>
है जो आपके नियंत्रण में है।
उदाहरण के लिए:
public void ProcessIDic(IEnumerable<IDic> sequence)
{
// Implementation
}
के बजाय:
public void ProcessIDic(List<IDic> list)
{
// Implementation
}
List<Client> listOfA = new List<Client>();
List<IDic> list = listOfA.Cast<IDic>().ToList();
यह केवल नए List<IDic>
तत्वों को बनाने और सभी तत्वों को स्थानांतरित करके संभव है ।
.Net 3.5 में, आप निम्न कार्य कर सकते हैं:
List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());
इस मामले में सूची के लिए निर्माता IEnumerable लेता है।
सूची हालांकि केवल IEnumerable के लिए परिवर्तनीय है। भले ही myObj ISomeInterface के लिए परिवर्तनीय हो सकता है लेकिन IEnumerable का प्रकार IEnumerable के लिए परिवर्तनीय नहीं है।