2017-01-11 5 views
8

उदाहरण के लिए के रूप में tuples deconstruct करने के लिए मैंसी # 7 में यह संभव है विधि तर्क

 void test(Action<ValueTuple<string, int>> fn) 
     { 
      fn(("hello", 10)); 
     } 

     test(t => { 
      var (s, i) = t; 
      Console.WriteLine(s); 
      Console.WriteLine(i); 
     }); 

है मैं इस

 void test(Action<ValueTuple<string, int>> fn) 
     { 
      fn(("hello", 10)); 
     } 

     test((s,i) => { 
      Console.WriteLine(s); 
      Console.WriteLine(i); 
     }); 

की तरह कुछ लिखने के लिए चाहते हैं यह कुछ उचित अंकन के साथ संभव है?

उत्तर

8

आप इसे करने के लिए छोटा कर सकते हैं:

void test(Action<ValueTuple<string, int>> fn) 
{ 
    fn(("hello", 10)); 
} 

test(((string s, int i) t) => 
{ 
    Console.WriteLine(t.s); 
    Console.WriteLine(t.i); 
}); 

उम्मीद है, एक दिन हम विधि मंगलाचरण के लिए एक टपल से पैरामीटर splat करने में सक्षम हो सकता है:

void test(Action<ValueTuple<string, int>> fn) 
{ 
    fn(@("hello", 10)); // <-- made up syntax 
} 

test((s, i) => 
{ 
    Console.WriteLine(s); 
    Console.WriteLine(i); 
}); 

लेकिन इस समय नहीं।

+0

('जनता स्थिर वस्तु [toArray (इस ValueTuple टी)] {वापसी नई वस्तु [] {t.Item1, t.Item2};} ') आप' fn.DynamicInvoke (("हैलो", 10) का उपयोग कर सकते हैं। ToArray()); '- निश्चित रूप से उस बिंदु पर यह और अधिक समझ सकता है केवल 'आमंत्रण' का विस्तार करने के लिए। – NetMage

+0

बहुत अच्छा जवाब। मैं दस्तावेज़ों में इस वाक्यविन्यास को खोजने की कोशिश कर रहा था और सफल नहीं हुआ था। क्या आप दस्तावेज़ों को एक लिंक प्रदान कर सकते हैं जहां इसे समझाया गया है? –

+0

@AndriiLitvinov, आप किस बात का जिक्र कर रहे हैं? –

2

आपके अनुरोध को देखने के दो तरीके हैं, लेकिन न तो C# 7.0 में समर्थित है।

  • कोई तर्कों में टुपल्स का विभाजन कर रहा है: एक विधि को एक टुपल के साथ बुला रहा है, और विधि के अलग-अलग तर्कों में ट्यूपल स्प्लट के तत्व हैं। आप आज M(tuple.first, tuple.second) का आह्वान करके मैन्युअल रूप से ऐसा कर सकते हैं।
  • दूसरा लैम्ब्डा पैरामीटर में विघटन है: जब एक लैम्ब्डा को पैरामीटर के साथ बुलाया जाता है, तो पैरामीटर को तत्वों में विभाजित करें और लैम्बडा बॉडी में उन तत्वों का उपयोग करें। आप आज इसे लैम्ब्डा को x => { var (first, second) = x; Write(first); Write(second); } के रूप में परिभाषित करके मैन्युअल रूप से कर सकते हैं।

csharplang design repo में प्रस्तावों पर चर्चा की जा रही है।

कुछ विस्तार तरीकों के साथ
संबंधित मुद्दे