এক্সপ্রেশন.কোট () কী করে যে এক্সপ্রেশন? কনস্ট্যান্ট () ইতিমধ্যে করতে পারে না?


98

দ্রষ্টব্য: আমি আগের প্রশ্নটি সম্পর্কে অবগত রয়েছি " লিনকিউ এর এক্সপ্রেশন.কোট পদ্ধতির উদ্দেশ্য কী? , তবে আপনি যদি পড়েন তবে দেখবেন এটি আমার প্রশ্নের উত্তর দেয় না।

আমি বুঝেছি এর বর্ণিত উদ্দেশ্য Expression.Quote()কী। তবে Expression.Constant()একই উদ্দেশ্যে ব্যবহার করা যেতে পারে ( Expression.Constant()ইতিমধ্যে ব্যবহৃত সমস্ত উদ্দেশ্য ছাড়াও )। অতএব, কেন মোটেই Expression.Quote()প্রয়োজন তা আমি বুঝতে পারি না ।

এটি প্রদর্শনের জন্য, আমি একটি চটজলদি উদাহরণ লিখেছি যেখানে প্রথাগতভাবে কেউ ব্যবহার করবেন Quote(বিস্ময়কর পয়েন্টগুলি চিহ্নিত রেখাটি দেখুন) তবে আমি Constantপরিবর্তে এটি ব্যবহার করেছি এবং এটি সমানভাবে ভাল কাজ করেছে:

string[] array = { "one", "two", "three" };

// This example constructs an expression tree equivalent to the lambda:
// str => str.AsQueryable().Any(ch => ch == 'e')

Expression<Func<char, bool>> innerLambda = ch => ch == 'e';

var str = Expression.Parameter(typeof(string), "str");
var expr =
    Expression.Lambda<Func<string, bool>>(
        Expression.Call(typeof(Queryable), "Any", new Type[] { typeof(char) },
            Expression.Call(typeof(Queryable), "AsQueryable",
                            new Type[] { typeof(char) }, str),
            // !!!
            Expression.Constant(innerLambda)    // <--- !!!
        ),
        str
    );

// Works like a charm (prints one and three)
foreach (var str in array.AsQueryable().Where(expr))
    Console.WriteLine(str);

এর আউটপুট expr.ToString()উভয়ের জন্যও একই (আমি ব্যবহার করি Constantবা নাও Quote)।

উপরোক্ত পর্যবেক্ষণগুলি দেওয়া, এটি Expression.Quote()প্রত্যাখ্যান করে appears সি # সংকলকটি নেস্টেড ল্যাম্বডা এক্সপ্রেশনগুলি সংখ্যার Expression.Constant()পরিবর্তে জড়িত একটি এক্সপ্রেশন ট্রিতে সংকলন করার জন্য তৈরি করা যেতে পারে Expression.Quote()এবং যে কোনও লিনকিউ ক্যোয়ারী সরবরাহকারী যে অন্য কোনও ক্যোয়ারী ভাষায় (যেমন এসকিউএল) এক্সপ্রেশন ট্রিগুলিতে প্রসেস করতে চায় তার পরিবর্তে ConstantExpressionটাইপের সাথে সন্ধান করতে পারে বিশেষ নোড টাইপ সহ Expression<TDelegate>একটি , এবং সমস্ত কিছু একই হবে।UnaryExpressionQuote

আমি কী মিস করছি? কেন Expression.Quote()এবং আবিষ্কারের Quoteজন্য বিশেষ নোড টাইপ ছিল UnaryExpression?

উত্তর:


191

সংক্ষিপ্ত উত্তর:

উদ্ধৃতি অপারেটর এমন একটি অপারেটর যা এটির অপারেন্ডে ক্লোজার সিঁটমিককে প্ররোচিত করে । ধ্রুবকগুলি কেবল মান।

কোট এবং ধ্রুবক বিভিন্ন আছে অর্থ এবং সেইজন্য আছে একটি অভিব্যক্তি গাছ বিভিন্ন উপস্থাপনা । দুটি খুব আলাদা জিনিসের জন্য একই উপস্থাপনা থাকা অত্যন্ত বিভ্রান্তিকর এবং বাগ প্রবণ।

দীর্ঘ উত্তর:

নিম্নোক্ত বিবেচনা কর:

(int s)=>(int t)=>s+t

বাইরের ল্যাম্বডা হ'ল সংযোজনকারীদের জন্য একটি কারখানা যা বাইরের ল্যাম্বদার প্যারামিটারের সাথে আবদ্ধ।

এখন, ধরুন আমরা এটিকে একটি এক্সপ্রেশন ট্রি হিসাবে উপস্থাপন করতে চাই যা পরে সংকলন এবং সম্পাদন হবে। এক্সপ্রেশন গাছের দেহটি কী হওয়া উচিত? আপনি সংকলিত রাষ্ট্রটি কোনও প্রতিনিধি বা কোনও এক্সপ্রেশন ট্রি ফিরিয়ে দিতে চান তা নির্ভর করে।

আসুন উদ্বেগজনক মামলাটি খারিজ করে শুরু করি। যদি আমরা এটির কোনও প্রতিনিধিকে ফিরিয়ে দিতে চাই তবে কোট বা কনস্ট্যান্ট ব্যবহার করবেন কিনা তা প্রশ্ন একটি মূল বিষয়:

        var ps = Expression.Parameter(typeof(int), "s");
        var pt = Expression.Parameter(typeof(int), "t");
        var ex1 = Expression.Lambda(
                Expression.Lambda(
                    Expression.Add(ps, pt),
                pt),
            ps);

        var f1a = (Func<int, Func<int, int>>) ex1.Compile();
        var f1b = f1a(100);
        Console.WriteLine(f1b(123));

ল্যাম্বডায় একটি নেস্টেড ল্যাম্বদা রয়েছে; সংকলক বাহ্য ল্যাম্বদার জন্য উত্পন্ন ফাংশনটির রাজ্যের উপর বন্ধ হয়ে একটি ফাংশনের প্রতিনিধি হিসাবে অভ্যন্তরীণ ল্যাম্বদা উত্পন্ন করে। আমাদের আর এই মামলা বিবেচনা করা উচিত।

মনে করুন আমরা সংকলিত রাষ্ট্রটি অভ্যন্তরের কোনও এক্সপ্রেশন ট্রি ফিরিয়ে দিতে চাই wish এটি করার দুটি উপায় রয়েছে: সহজ উপায় এবং শক্ত উপায়।

কঠিন উপায় পরিবর্তে যে বলা হয়

(int s)=>(int t)=>s+t

আমরা আসলে যা বোঝাতে চাইছি তা হ'ল

(int s)=>Expression.Lambda(Expression.Add(...

এবং তারপর জন্য অভিব্যক্তি গাছ উৎপন্ন যে , উত্পাদক এই জগাখিচুড়ি :

        Expression.Lambda(
            Expression.Call(typeof(Expression).GetMethod("Lambda", ...

ব্লা ব্লা ব্লা, লাম্বদা তৈরি করতে কয়েক ডজন লাইনের প্রতিচ্ছবি কোড। উদ্ধৃতি অপারেটরের উদ্দেশ্যটি হ'ল এক্সপ্রেশন ট্রি সংকলককে জানিয়ে দিন যে আমরা চাই যে প্রদত্ত ল্যাম্বদা স্পষ্টভাবে এক্সপ্রেশন ট্রি জেনারেশন কোড উত্পন্ন না করে কোনও ফাংশন হিসাবে নয়, একটি এক্সপ্রেশন ট্রি হিসাবে বিবেচিত হবে

সহজ উপায়:

        var ex2 = Expression.Lambda(
            Expression.Quote(
                Expression.Lambda(
                    Expression.Add(ps, pt),
                pt)),
            ps);

        var f2a = (Func<int, Expression<Func<int, int>>>)ex2.Compile();
        var f2b = f2a(200).Compile();
        Console.WriteLine(f2b(123));

এবং প্রকৃতপক্ষে, আপনি যদি এই কোডটি সংকলন করেন এবং চালনা করেন তবে সঠিক উত্তর পাবেন।

লক্ষ্য করুন যে উদ্ধৃতি অপারেটর হ'ল অপারেটর যা অভ্যন্তরীণ ল্যাম্বডায় ক্লোজার শব্দার্থকে প্ররোচিত করে যা একটি বাহ্যিক ভেরিয়েবল ব্যবহার করে, বহিরাগত ল্যাম্বদার একটি আনুষ্ঠানিক প্যারামিটার।

প্রশ্নটি হ'ল: কেন উক্তিটি মুছে ফেলা হচ্ছে না এবং এটিকে একই জিনিস করতে হবে না?

        var ex3 = Expression.Lambda(
            Expression.Constant(
                Expression.Lambda(
                    Expression.Add(ps, pt),
                pt)),
            ps);

        var f3a = (Func<int, Expression<Func<int, int>>>)ex3.Compile();
        var f3b = f3a(300).Compile();
        Console.WriteLine(f3b(123));

ধ্রুবক ক্লোজার শব্দার্থবিজ্ঞান প্ররোচিত করে না। এটা কেন করা উচিত? আপনি বলেছিলেন যে এটি একটি ধ্রুবক ছিল । এটি কেবল একটি মান। এটি সংকলকের হাতে যেমন নিখুঁত হওয়া উচিত; সংকলকটি যেখানে প্রয়োজন সেখানে স্ট্যাকের জন্য সেই মানটির একটি ডাম্প তৈরি করতে সক্ষম হবে।

যেহেতু কোনও বন্ধ হওয়ার প্ররোচিত নেই, আপনি যদি এটি করেন তবে আপনি "সিস্টেমের মতো একটি ভেরিয়েবল 'এর' পাবেন nt

(একদিকে: আমি উদ্ধৃত অভিব্যক্তি গাছগুলি থেকে ডেলিগেট তৈরির জন্য কোড জেনারেটরটি কেবল পর্যালোচনা করেছি এবং দুর্ভাগ্যক্রমে 2006 এ কোডটি আমি কোডটিতে রেখেছিলাম এমন একটি মন্তব্য এখনও রয়েছে F FYI, উদ্ধৃত বাইরের প্যারামিটারটি একটি ধ্রুবক হিসাবে স্ন্যাপশট করা হয় যখন উদ্ধৃত হয়েছে) রানটাইম সংকলক দ্বারা এক্সপ্রেশন ট্রি একটি প্রতিনিধি হিসাবে পুনরায় সংশোধন করা হয়েছে I আমি কোডটি কেন লিখলাম তার সঠিক কারণ ছিল যা আমি এই মুহুর্তে স্মরণ করি না, তবে এটির বাইরের পরামিতিগুলির মানগুলি বন্ধ করার প্রকারের বাজে পার্শ্ব প্রতিক্রিয়া রয়েছে পরিবর্তে ভেরিয়েবল ওভার বন্ধ। স্পষ্টতই যে দলটি কোডটি উত্তরাধিকারসূত্রে পেয়েছে তারা সেই ত্রুটিটি স্থির করার সিদ্ধান্ত নিয়েছে, সুতরাং আপনি যদি একটি সংকলিত উদ্ধৃত অভ্যন্তরীণ ল্যাম্বডায় কোনও ক্লোজড ওভার বাইরের প্যারামিটারের পরিবর্তনের উপর নির্ভর করছেন তবে আপনি হতাশ হবেন। তবে, যেহেতু এটি উভয়ের কাছেই খুব খারাপ প্রোগ্রামিং অনুশীলন (1) একটি ফর্মাল প্যারামিটারটি পরিবর্তন করে এবং (2) বাইরের ভেরিয়েবলের পরিবর্তনের উপর নির্ভর করে, তাই আমি আপনাকে সুপারিশ করব যে আপনি আপনার প্রোগ্রামটি এই দুটি খারাপ প্রোগ্রামিং অনুশীলনটি ব্যবহার না করে পরিবর্তিত করুন একটি স্থির জন্য অপেক্ষা করা যা আগত বলে মনে হচ্ছে না। ত্রুটির জন্য দুঃখিত।)

সুতরাং, প্রশ্নের পুনরাবৃত্তি:

সি # সংকলকটি এক্সপ্রেশন.কোট () এর পরিবর্তে এক্সপ্রেশন.কনস্ট্যান্ট () এবং কোনও লিনকিউ ক্যোয়ারী সরবরাহকারী যা অন্য কোনও ক্যোয়ারী ভাষায় (যেমন এসকিউএল হিসাবে এক্সপ্রেশন ট্রি প্রক্রিয়াকরণ করতে চায়) জড়িত একটি এক্সপ্রেশন ট্রিতে নেস্টেড ল্যাম্বডা এক্সপ্রেশনগুলি সংকলন করতে পারত ( ) বিশেষ কোট নোড প্রকারের সাথে একটি UnaryExpression এর পরিবর্তে এক্সপ্রেসনের ধরণের কনস্ট্যান্টএক্সপ্রেসনের সন্ধান করতে পারে এবং অন্য সমস্ত কিছুই একই রকম হবে।

আপনি সঠিক. পতাকা হিসাবে ধ্রুবক অভিব্যক্তির ধরণটি ব্যবহার করে আমরা শব্দার্থক তথ্যগুলি এনকোড করতে পারি যার অর্থ "এই মানটির উপর ক্লোজার শব্দার্থকে প্ররোচিত করুন" ।

"ধ্রুবক" এর অর্থ তখন "এই ধ্রুবক মানটি ব্যবহার করুন, যদি না টাইপটি একটি এক্সপ্রেশন গাছের ধরণের হয়ে থাকে এবং মানটি একটি বৈধ এক্সপ্রেশন ট্রি হয়, সেক্ষেত্রে পরিবর্তিত পুনরায় লেখার ফলে অভিব্যক্তি গাছের মানটি ব্যবহার করুন প্রদত্ত অভিব্যক্তি গাছের অভ্যন্তরটি কোনও বহিরাগত ল্যাম্বডাসের প্রসঙ্গে যে ক্লোজার শব্দার্থকে প্ররোচিত করতে পারে যা আমরা এখনই থাকতে পারি।

কিন্তু কেন হবে আমরা যে পাগল জিনিস কি? উদ্ধৃতি অপারেটর একটি অত্যন্ত জটিল অপারেটর এবং আপনি যদি এটি ব্যবহার করতে যাচ্ছেন তবে স্পষ্টভাবে এটি ব্যবহার করা উচিত। আপনি পরামর্শ দিচ্ছেন যে ইতিমধ্যে সেখানে উপস্থিত কয়েক ডজনের মধ্যে একটি অতিরিক্ত কারখানা পদ্ধতি এবং নোড টাইপ না করার বিষয়ে পার্সোনমোনস হওয়ার জন্য, আমরা কনস্ট্যান্টগুলিতে একটি উদ্ভট কোণটির সংযোজন করি, যাতে ধ্রুবকগুলি কখনও কখনও যুক্তিযুক্তভাবে ধ্রুবক হয় এবং কখনও কখনও সেগুলি আবার লেখা হয় are বন্ধ শব্দার্থক সঙ্গে ল্যাম্বডাস।

এটি কিছুটা বিজোড় প্রভাব ফেলবে যা ধ্রুবকটির অর্থ "এই মানটি ব্যবহার করুন" না। ধরুন কিছু উদ্ভট কারণে আপনি উপরের তৃতীয় কেসটি একটি ডেলিগেটের মধ্যে একটি এক্সপ্রেশন ট্রি সংকলন করতে চেয়েছিলেন যা একটি বহিরাগত ভেরিয়েবলের কাছে পুনর্লিখনের উল্লেখ নেই এমন একটি এক্সপ্রেশন ট্রি রাখে? কেন? সম্ভবত আপনি নিজের সংকলকটি পরীক্ষা করছেন এবং কেবলমাত্র ধ্রুবকটি পেরিয়ে যেতে চান যাতে আপনি এটির পরে আরও কিছু বিশ্লেষণ করতে পারেন। আপনার প্রস্তাব যে অসম্ভব করে তোলে; অভিব্যক্তি গাছের ধরণের হতে পারে এমন যে কোনও ধ্রুবক নির্বিশেষে আবার লিখিত হবে। একটির কাছে যুক্তিযুক্ত প্রত্যাশা থাকে যে "ধ্রুবক" অর্থ "এই মানটি ব্যবহার করুন"। "কনস্ট্যান্ট" হ'ল "আমি যা বলি তা করুন" নোড। ধ্রুবক প্রসেসর ' টাইপ উপর ভিত্তি করে বলতে।

এবং অবশ্যই যে এখন আপনি বুঝতে বোঝা নির্বাণ করছে নোট (যে ধ্রুব বুঝতে শব্দার্থবিদ্যা মানে এক ক্ষেত্রে "ধ্রুবক" এবং একটি পতাকা উপর ভিত্তি "অবসান শব্দার্থবিদ্যা রাজি করানো" জটিল হয়েছে যে টাইপ সিস্টেমের মধ্যে উপর) যে সরবরাহকারী যা কেবলমাত্র মাইক্রোসফ্ট সরবরাহকারীদের উপর নয়, একটি অভিব্যক্তি গাছের অর্থ বিশ্লেষণ করে। এই তৃতীয় পক্ষের সরবরাহকারীদের মধ্যে কতজন এটি ভুল হয়ে যাবে?

"উদ্ধৃতি" একটি বড় লাল পতাকা বয়ে যাচ্ছে যা বলে যে "আরে বন্ধু, এখানে দেখুন, আমি একটি নেস্টেড ল্যাম্বডা এক্সপ্রেশন এবং যদি আমি কোনও বাইরের ভেরিয়েবলের উপর বন্ধ হয়ে থাকি তবে আমার গায়ে বেমানান শব্দার্থ থাকে!" যদিও "কনস্ট্যান্ট" বলছে "আমি মান ব্যতীত আর কিছুই না; তুমি যেমন উপযুক্ত ঠিক তেমন ব্যবহার কর" যখন কোনও কিছু জটিল এবং বিপজ্জনক হয় তখন আমরা এটিকে লাল পতাকা বানাতে চাই, ব্যবহারকারীটি এই মানটি বিশেষ কিনা তা সন্ধান করার জন্য টাইপ সিস্টেমের মাধ্যমে খোঁড়াখুঁটি করে না fact

তদুপরি, অপ্রয়োজনীয়তা এড়ানো এমনকি একটি লক্ষ্যও ধারণা ভুল। অবশ্যই, অপ্রয়োজনীয়, বিভ্রান্তিকর অপ্রয়োজনীয়তা এড়ানো একটি লক্ষ্য, তবে সর্বাধিক অপ্রয়োজনীয়তা একটি ভাল জিনিস; অপ্রয়োজনীয়তা স্পষ্টতা তৈরি করে। নতুন কারখানা পদ্ধতি এবং নোড প্রকারঃ সস্তা । আমরা আমাদের যতটুকু প্রয়োজন তৈরি করতে পারি যাতে প্রত্যেকে একটি করে পরিষ্কারভাবে একটি অপারেশন উপস্থাপন করে। আমাদের "এই ক্ষেত্রটি যদি এই জিনিসটিতে সেট না করা হয় তবে এই ক্ষেত্রে এটির অর্থ অন্য কোনও জিনিস like"


11
আমি এখন বিব্রতবোধ করছি কারণ আমি বন্ধ শব্দার্থবিজ্ঞানের কথা ভাবি নি এবং নেস্টেড ল্যাম্বদা বাইরের ল্যাম্বডা থেকে একটি প্যারামিটার ক্যাপচার করে এমন কোনও ক্ষেত্রে পরীক্ষা করতে ব্যর্থ হয়েছিল। আমি যদি তা করে থাকি তবে আমি পার্থক্যটি লক্ষ্য করতাম। আপনার উত্তরের জন্য আবার অনেক ধন্যবাদ।
টিমভি

19

এই প্রশ্ন ইতিমধ্যে একটি দুর্দান্ত উত্তর পেয়েছে। আমি অতিরিক্তভাবে এমন একটি উত্সকে নির্দেশ করতে চাই যা অভিব্যক্তি গাছ সম্পর্কিত প্রশ্নগুলির সাথে সহায়ক প্রমাণ করতে পারে:

সেখানে হয় মাইক্রোসফ্ট দ্বারা কল করা একটি কোডপ্লেক্স প্রকল্প ছিল গতিশীল ভাষা রানটাইম। এর নথিতে ডকুমেন্ট শিরোনাম রয়েছে,"এক্সপ্রেশন ট্রি ভি 2 স্পেক", যা হ'ল: নেট নেট 4 এ লিনকিউ এক্সপ্রেশন গাছের জন্য স্পেসিফিকেশন।

আপডেট: কোডপ্লেক্স বিচ্ছিন্ন। ফটকা খেলা (পিডিএফ) v2 এক্সপ্রেশন গাছ GitHub থেকে সরানো হয়েছে

উদাহরণস্বরূপ, এটি নিম্নলিখিত সম্পর্কে বলে Expression.Quote:

4.4.42 উদ্ধৃতি

UnaryExpressions এ উক্তি ব্যবহার করুন এমন একটি অভিব্যক্তি উপস্থাপনের জন্য যা এক্সপ্রেশনর ধরণের "ধ্রুবক" মান রয়েছে। কনস্ট্যান্ট নোডের বিপরীতে, কোট নোডে প্যারামিটারএক্সপ্রেসন নোডগুলি বিশেষভাবে পরিচালনা করে। যদি কোনও অন্তর্ভুক্ত প্যারামিটার এক্সপ্রেসন নোড এমন কোনও স্থানীয় ঘোষণা করে যা ফলাফলের এক্সপ্রেশনটিতে বন্ধ হয়ে যায় তবে কোটটি তার রেফারেন্স অবস্থানগুলিতে প্যারামিটার এক্সপ্রেসনকে প্রতিস্থাপন করে। চলাকালীন সময়ে যখন কোট নোডটি মূল্যায়ন করা হয়, এটি প্যারামিটার এক্সপ্রেসন রেফারেন্স নোডগুলির জন্য ক্লোজার ভেরিয়েবল রেফারেন্সকে প্রতিস্থাপন করে এবং তারপরে উদ্ধৃত এক্সপ্রেশনটি প্রদান করে। […] (পৃষ্ঠা ––-––)


4
একজাতীয় থেকে মৎস্য ধরণের শিখানোর দুর্দান্ত উত্তর। আমি কেবল যুক্ত করতে চাই যে ডকুমেন্টেশনটি সরানো হয়েছে এবং এটি এখন ডকস.মাইক্রোসফটকম /en-us/dotnet/framework/ … এ উপলব্ধ । উদ্ধৃত নথিটি বিশেষতঃ গিতহাবের
তুলনামূলকভাবে_রাণ্ডম

3

এটির পরে সত্যিই দুর্দান্ত উত্তর, এটি স্পষ্ট যে শব্দার্থকগুলি কী। এগুলি এত পরিষ্কার নয় যে কেন সেগুলি এমনভাবে ডিজাইন করা হয়েছে, বিবেচনা করুন:

Expression.Lambda(Expression.Add(ps, pt));

যখন এই ল্যাম্বদা সংকলিত হয় এবং অনুরোধ করা হয় তখন এটি অভ্যন্তরীণ অভিব্যক্তিটি মূল্যায়ন করে ফলাফলটি প্রদান করে। এখানে অভ্যন্তরীণ প্রকাশটি একটি সংযোজন, সুতরাং পিএস + পিটি মূল্যায়ন করা হয় এবং ফলাফলটি ফিরে আসে। এই যুক্তি অনুসরণ করে, নিম্নলিখিত অভিব্যক্তি:

Expression.Lambda(
    Expression.Lambda(
              Expression.Add(ps, pt),
            pt), ps);

বাইরের ল্যাম্বদা যখন আহ্বান করা হয় তখন কোনও অভ্যন্তরের ল্যাম্বদা সংকলিত পদ্ধতির রেফারেন্সটি ফিরিয়ে দেওয়া উচিত (কারণ আমরা বলি যে ল্যাম্বদা কোনও পদ্ধতি রেফারেন্সে সংকলন করে)। তাহলে আমাদের কেন একটি উক্তি দরকার ?! পদ্ধতির রেফারেন্সটি ফিরিয়ে দেওয়া হলে কেসটিকে আলাদা করতে To সেই রেফারেন্স অনুরোধের ফলাফল।

বিশেষত:

let f = Func<...>
return f; vs. return f(...);

কিছু কারণে দরুন নেট ডিজাইনার বেছে নেওয়া হয়েছে Expression.Quote (চ) প্রথম ক্ষেত্রে এবং প্লেইন জন্য সেকেন্ডের জন্য। আমার দৃষ্টিতে এটি প্রচুর বিভ্রান্তির সৃষ্টি করে, যেহেতু বেশিরভাগ প্রোগ্রামিং ভাষায় কোনও মান ফেরত দেওয়া সরাসরি ( কোট বা অন্য কোনও ক্রিয়াকলাপের প্রয়োজন হয় না), তবে অনুরোধের জন্য অতিরিক্ত লেখার (প্রথম বন্ধনী + যুক্তি) প্রয়োজন হয় যা কিছু প্রকারের সাথে অনুবাদ করে tes এমএসআইএল পর্যায়ে প্রার্থনা করুন । । নেট ডিজাইনারগণ এটিকে অভিব্যক্তি গাছগুলির পক্ষে বিপরীত করে তোলে। কারণ জানতে আকর্ষণীয় হবে।


0

আমি বিশ্বাস করি যে এটি দেওয়া মত আরও:

Expression<Func<Func<int>>> f = () => () => 2;

তোমার গাছ Expression.Lambda(Expression.Lambda)এবং fএকটি ল্যামডা করে একটি আয় জন্য এক্সপ্রেশন বৃক্ষ প্রতিনিধিত্ব করে Func<int>যে আয় 2

তবে আপনি যা চেয়েছিলেন তা যদি একটি ল্যাম্বডা হয় যা যে ল্যাম্বডায় ফিরে আসে তার জন্য এক্সপ্রেশন ট্রি প্রদান করে 2, তবে আপনার প্রয়োজন:

Expression<Func<Expression<Func<int>>>> f = () => () => 2;

আর এখন আপনার গাছ Expression.Lambda(Expression.Quote(Expression.Lambda))এবং fএকটি ল্যামডা যে আয় জন্য এক্সপ্রেশন বৃক্ষ প্রতিনিধিত্ব করে Expression<Func<int>>একটি জন্য এক্সপ্রেশন বৃক্ষ যে Func<int>যে আয় 2


-2

আমি মনে করি এখানে বিন্দুটি গাছের উদ্ভাসিতা। প্রতিনিধি সমন্বিত ধ্রুবক অভিব্যক্তিটিতে সত্যই একটি প্রতিনিধি হিসাবে ঘটে এমন কোনও জিনিস থাকে। এটি একটি অ্যানারি এবং বাইনারি এক্সপ্রেশনটির সরাসরি ভাঙ্গনের চেয়ে কম ভাবপূর্ণ।


তাই কি? এটি ঠিক কী যোগ করে? আপনি ইতিমধ্যে কনস্ট্যান্টএক্সপ্রেসনের মাধ্যমে প্রকাশ করতে পারেননি এমন ইউনারিএক্সগ্রেশন (যা ব্যবহার করার মতো একটি বিচিত্র ধরণের অভিব্যক্তি) দিয়ে আপনি কী "প্রকাশ" করতে পারেন?
টিমভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.