বেনামে পদ্ধতিতে কীভাবে মূল্য ফেরানো যায়?


90

এটি ব্যর্থ হয়

string temp = () => {return "test";};

ত্রুটি সহ

লাম্বদা এক্সপ্রেশনটিকে 'স্ট্রিং' টাইপে রূপান্তর করতে পারে না কারণ এটি কোনও প্রতিনিধি প্রকার নয়

ত্রুটির অর্থ কী এবং আমি কীভাবে এটি সমাধান করতে পারি?


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

উত্তর:


137

এখানে সমস্যাটি হ'ল আপনি একটি বেনামি পদ্ধতিটি সংজ্ঞায়িত করেছেন যা একটি প্রদান করে stringতবে সরাসরি এটিকে এটি নির্ধারণের চেষ্টা করছে string। এটি একটি অভিব্যক্তি যা যখন প্রার্থনা একটি উত্পাদন করে এর stringসরাসরি নয় একটি string। এটি একটি সামঞ্জস্যপূর্ণ প্রতিনিধি প্রকারে বরাদ্দ করা প্রয়োজন। এই ক্ষেত্রে সবচেয়ে সহজ পছন্দ হয়Func<string>

Func<string> temp = () => {return "test";};

এটি একটি লাইনে কিছুটা ingালাই বা ডেলিগেট কনস্ট্রাক্টর ব্যবহার করে ল্যাম্বদার ধরণটি প্রতিষ্ঠার জন্য অনুরোধের পরে করা যেতে পারে।

string temp = ((Func<string>)(() => { return "test"; }))();
string temp = new Func<string>(() => { return "test"; })();

দ্রষ্টব্য: উভয় নমুনা এক্সপ্রেশন ফর্মটিতে শর্ট করা যেতে পারে যার অভাব রয়েছে { return ... }

Func<string> temp = () => "test";
string temp = ((Func<string>)(() => "test"))();
string temp = new Func<string>(() => "test")();

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

@ চতুর্থ স্পেসে কিছু লজ্জা .ালাই দিয়ে এটি এক লাইনে করা যায়।
উপায়টি

বা এই ক্ষেত্রে, ঠিক Func<string> temp = () => "test";
গ্যাবে

বা আপনার সম্পাদনার ক্ষেত্রেstring temp = new Func<string>(() => "test")();
গ্যাবে

পারফেক্ট! যদি আমি কোন ইনট পাস করতে চাই, আপনি কি একটি লাইনে প্রদর্শন করতে পারেন? আমি এটি চেষ্টা করেছি কিন্তু যাচ্ছি না: ((ফানক <int, স্ট্রিং>) ((4) => {"পরীক্ষার"; {))));
চতুর্থ স্পেস

15

আপনি কোনও স্ট্রিং টাইপের জন্য কোনও ফাংশন প্রতিনিধি নির্ধারণের চেষ্টা করছেন । এটা চেষ্টা কর:

Func<string> temp = () => {return "test";};

আপনি এখন এইভাবে ফাংশনটি সম্পাদন করতে পারেন:

string s = temp();

"S" ভেরিয়েবলের মান এখন "পরীক্ষা" হবে।


4
এটি সংকলন করে না: "ল্যাম্বডা এক্সপ্রেশনটি একটি স্পষ্টভাবে টাইপ করা স্থানীয় ভেরিয়েবলের জন্য বরাদ্দ করতে পারে না"
ডেভ বিশ

@ ডেভ: আকর্ষণীয়, এই সীমাবদ্ধতা সম্পর্কে জানতেন না। আপডেট হয়েছে, ধন্যবাদ!
ডেভ সোয়ারস্কি

8

সামান্য সহায়ক ফাংশন এবং জেনেরিকগুলি ব্যবহার করে আপনি সংকলকটি প্রকারটি অনুমান করতে এবং এটি কিছুটা ছোট করতে পারেন:

public static TOut FuncInvoke<TOut>(Func<TOut> func)
{
    return func();
}

var temp = FuncInvoke(()=>"test");

পার্শ্ব দ্রষ্টব্য: আপনি অনামী প্রকারটি ফেরত দিতে সক্ষম হওয়ায় এটিও দুর্দান্ত:

var temp = FuncInvoke(()=>new {foo=1,bar=2});

আকর্ষণীয় কৌশল। এটি কি রান-টাইম ওভারহেড যুক্ত করে, বা এটি সমস্ত সংকলনের সময়ে রয়েছে?
টুলমেকারস্টেভ

@ টুলমেকারস্টেভ: আমার ধারণা যে এটি রান-টাইম ওভারহেডের একটি teeeensy বিট যোগ করবে (এটি অন্য পদ্ধতির ভিতরে একটি বেনাম পদ্ধতিতে একটি কলটি মোড়ানো) - তবে, আমি সন্দেহ করি যে এটি ফানসিভোভাক পদ্ধতিটি যেখানে সংজ্ঞায়িত হয়েছিল (সেখানে একই সমাবেশ) তার উপরও নির্ভর করবে একে বনাম বিভিন্ন সমাবেশ ইত্যাদি বলা হচ্ছে), যেহেতু এটি এমন এক ধরণের জিনিস হতে পারে যা সংকলক "ইনলাইন" করতে পারে। এটি একটি ধরণের প্রশ্নের উত্তর যা লোকেরা একটি দ্রুত পরীক্ষা প্রোগ্রাম লিখে সংকলন করে এবং তারপরে ফলাফলের আইএলকে আলাদা করে উত্তর দেয়।
ড্যানিয়েল স্কট

@ টলমেকারস্টেভ পারফরম্যান্স প্রভাবের শেষ "অনুমান" থেকে অনুসরণ করে, আমি যুক্ত করব যে পারফরম্যান্সের উপর এটির সবচেয়ে খারাপ প্রভাব এমনকি কার্যত শূন্য হবে (একটি অতিরিক্ত ফাংশন কল, একটি অ-ভার্চুয়াল, স্ট্যাটিক পদ্ধতিতে)। যে কেউ এই কৌশলটি ব্যবহার করছেন সম্ভবত এটি করছেন কারণ তারা চারিদিকে ল্যাম্বডাস নিক্ষেপ করছেন। এর অর্থ তারা সম্ভবত কোথাও কমপক্ষে কয়েকটি লিনকিউ এক্সটেনশন পদ্ধতি ব্যবহার করছেন, সুতরাং সমস্যাগুলি ভাল বলে মনে হয় যে তারা অযাচিতভাবে একাধিক লিনকিউ পদ্ধতি একসাথে বেঁধে রেখেছেন যাতে একটি অতিরিক্ত ফাংশন কলের চেয়ে ১০০,০০০ গুণ খারাপ পারফরম্যান্সে আঘাত লাগে hur ;)
ড্যানিয়েল স্কট

6

আপনি যুক্তি দিয়ে বেনামে পদ্ধতি ব্যবহার করতে পারেন:

int arg = 5;

string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);

আপনি পারেন, তবে দয়া করে ব্যাখ্যা করুন যে এটি কীভাবে প্রশ্নের উত্তর।
নির্মাতা

3

একটি বেনামি পদ্ধতি একটি ফানক প্রতিনিধি ব্যবহার করে কোনও মান ফেরত দিতে পারে। এখানে একটি উদাহরণ যেখানে আমি দেখিয়েছি কীভাবে কোনও বেনামি পদ্ধতি ব্যবহার করে কোনও মান ফেরত দিতে হয়।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {


        static void Main(string[] args)
        {
            Func<int, int> del = delegate (int x)
              {
                  return x * x;

              };

            int p= del(4);
            Console.WriteLine(p);
            Console.ReadLine();
        }
    }
}

0

এটি সি # 8 ব্যবহার করে অন্য একটি উদাহরণ ( সমান্তরাল কাজগুলিকে সমর্থন করে অন্যান্য। নেট সংস্করণগুলির সাথেও কাজ করতে পারে )

using System;
using System.Threading.Tasks;

namespace Exercise_1_Creating_and_Sharing_Tasks
{
    internal static class Program
    {
        private static int TextLength(object o)
        {
            Console.WriteLine($"Task with id {Task.CurrentId} processing object {o}");
            return o.ToString().Length;
        }

        private static void Main()
        {
            const string text1 = "Welcome";
            const string text2 = "Hello";

            var task1 = new Task<int>(() => TextLength(text1));
            task1.Start();

            var task2 = Task.Factory.StartNew(TextLength, text2);

            Console.WriteLine($"Length of '{text1}' is {task1.Result}");
            Console.WriteLine($"Length of '{text2}' is {task2.Result}");

            Console.WriteLine("Main program done");
            Console.ReadKey();
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.