ExpressionTrees संकलक की तरह लग रहा कई व्यवहार में सी # कल्पना के साथ पास होना चाहिए, लेकिन विपरीत सी # किसी भी enum-type
को decimal
से रूपांतरण के लिए कोई समर्थन नहीं है:क्या यह एक अभिव्यक्ति ट्री बग है? # 2
using System;
using System.Linq.Expressions;
class Program
{
static void Main()
{
Func<decimal, ConsoleColor> converter1 = x => (ConsoleColor) x;
ConsoleColor c1 = converter1(7m); // fine
Expression<Func<decimal, ConsoleColor>> expr = x => (ConsoleColor) x;
// System.InvalidOperationException was unhandled
// No coercion operator is defined between types
// 'System.Decimal' and 'System.ConsoleColor'.
Func<decimal, ConsoleColor> converter2 = expr.Compile();
ConsoleColor c2 = converter2(7m);
}
}
अन्य शायद ही कभी इस्तेमाल सी # स्पष्ट रूपांतरण, double -> enum-type
की तरह मौजूद है और सी # विनिर्देशन में समझाया गया है, लेकिन decimal -> enum-type
नहीं है। क्या यह एक बग है?
मुझे नहीं पता था कि सी # भाषा बनाने में मनुष्यों को नुकसान पहुंचाया गया था :) –
"दशमलव रूपांतरण वास्तव में रनटाइम में उपयोगकर्ता द्वारा परिभाषित रूपांतरण के रूप में कार्यान्वित किए जाते हैं, लेकिन संकलक द्वारा अंतर्निहित रूपांतरण के रूप में माना जाता है": इसका क्या अर्थ है , और यह इस तरह क्यों किया गया था? – Brian
@ ब्रायन: जब आप एक प्रतिनिधित्व-बदलते रूपांतरण करते हैं, तो दो बार int कहें, एक आईएल निर्देश है जो वास्तव में उस रूपांतरण को करता है। जब आप डबल करने के लिए दशमलव करते हैं, तो हम वास्तव में रूपांतरण करने के लिए एक विधि को कॉल करने के लिए कोड उत्पन्न करते हैं; decimals के लिए कोई अंतर्निहित सीएलआर रूपांतरण निर्देश नहीं है। लेकिन एक * भाषा * परिप्रेक्ष्य से हम दशमलव रूपांतरणों को * प्रकट * करना चाहते हैं ताकि भाषा में अंतर्निहित रूपांतरण हो; हमारे पास अंतर्निर्मित और उपयोगकर्ता द्वारा प्रदत्त रूपांतरणों के लिए अलग-अलग नियम हैं। तो हमें दशकों के साथ दृश्यों के पीछे क्या हो रहा है, इसे छिपाने के लिए कुछ विशेष दृश्यों का निर्माण करना होगा। –