void main() {
  var foo = number as int; // Works
  for (var bar in numbers as List<int>) {} // Run-time error
}

num get number => 0;

List<num> get numbers => [0];

नोट: मैं उस समाधान की तलाश नहीं कर रहा हूं कि उस काम को कैसे किया जाए। सवाल यह है कि जब सूची वास्तव में List<int> का एक प्रकार है तो मैं List<num> को List<int> में डाउनकास्ट करने में असमर्थ क्यों हूं।

0
iDecode 26 अगस्त 2020, 21:52

1 उत्तर

सबसे बढ़िया उत्तर

इस मामले में, आपकी सूची List<int> नहीं है।

सूची मान द्वारा उत्पन्न होता है

List<num> get numbers => [0];

आपने सूची में कोई प्रकार नहीं लिखा था, जैसे <int>[0], इसलिए आपके लिए सूची के प्रकार का अनुमान लगाया जाएगा। डार्ट उस प्रकार का अनुमान लगाने के लिए दो प्रकार की जानकारी का उपयोग करता है:

  • List<num> का संदर्भ प्रकार (संदर्भ के लिए क्या आवश्यक है)। सभी अभिव्यक्तियों का संदर्भ प्रकार नहीं होता है, लेकिन यह एक करता है।
  • तत्व प्रकार (तत्वों के लिए क्या आवश्यक है) जो int है।

यदि कोई संदर्भ प्रकार है, तो यह हमेशा जीतता है। तो, आपका गेटर होने का अनुमान है:

List<num> get numbers => <num>[0];

जब आप numbers as List<int> करने का प्रयास करते हैं, तो यह विफल हो जाता है क्योंकि List<num> List<int> नहीं है (उप-टाइपिंग दूसरी तरफ है)।

वास्तव में समाधान की तलाश कर रहे अन्य लोगों के लिए, आप या तो सूची को List<int> में बदल सकते हैं, एक नई सूची बनाकर या cast का उपयोग करके इसे लपेट कर, या आप अलग-अलग तत्वों को कास्ट कर सकते हैं। या आप एक निहित डाउन-कास्ट को मजबूर कर सकते हैं। सभी मामलों में, यदि सूची में एक गैर-int मान होता है, तो कोड हो जाएगा विफल हो जाएगा।

for (var bar in <int>[...numbers]) { ... }
for (var bar in numbers.cast<int>()) { ... }
for (int bar in numbers as List<dynamic>) { ... }
for (var bar in numbers) { ... bar as int ... }
1
iDecode 27 अगस्त 2020, 13:09