আউট প্যারামিটার সহ Func <T>


167

আমি কি ফানক হিসাবে আউট প্যারামিটার দিয়ে কোনও পদ্ধতি পাস করতে পারি?

public IList<Foo> FindForBar(string bar, out int count) { }

// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }

ফানকের একটি ধরণের প্রয়োজন তাই সেখানে সংকলন করা হবে না, এবং কলিং লিস্ট ফাংশনটির একটি আন্ত প্রয়োজন এবং এটি বাইরে প্রবেশ করতে দেয় না।

এই কাজ করতে একটি উপায় আছে কি?

উত্তর:


228

refএবং outটাইপ প্যারামিটার সংজ্ঞাটির অংশ নয় তাই আপনি বিল্ট-ইন Funcপ্রতিনিধিটি পাস refএবং outতর্ক করতে ব্যবহার করতে পারবেন না । আপনি চাইলে অবশ্যই আপনার নিজের প্রতিনিধি ঘোষণা করতে পারেন:

delegate V MyDelegate<T,U,V>(T input, out U output);

7
সি # 4 (2010) এবং পরে (যখন আপনি নিজের উত্তর লিখেছিলেন তখন প্রকাশিত হয়নি) এটি Tবিপরীতমুখী Vহিসাবে এবং সমবায়িক হিসাবে চিহ্নিত করা সম্ভব । যাইহোক, একটি প্যারামিটার যেহেতু ( outputটাইপ) Uপাস করা হয়েছে রেফারেন্স দ্বারা , Uসহ- বা contravariant নয় বলে চিহ্নিত করা যেতে পারে এবং "পরিবর্তিত" থাকা আবশ্যক। সুতরাং public delegate V MyDelegate<in T, U, out V>(T input, out U output);আপনি যদি সি # 4 বা তার পরে ব্যবহার করেন তবে বিবেচনা করুন ।
জেপ্প স্টিগ নীলসন


24

ফলাফলগুলি encapsulate করতে একটি শ্রেণি তৈরি করবেন না কেন?

public class Result
{
     public IList<Foo> List { get; set; }
     public Int32 Count { get; set; }
}

13

Funcপ্রতিনিধিদের (অথবা পরিবার Actionযে বিষয়টি জন্য) কিছুই কিন্তু সহজ প্রতিনিধি ধরনের মত ঘোষিত হয়

//.NET 4 and above
public delegate TResult Func<out TResult>()
public delegate TResult Func<in T, out TResult>(T obj)

//.NET 3.5
public delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
public delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3)

ইত্যাদি হিসাবে প্রতিনিধিদের আউট / রেফ প্যারামিটার থাকতে পারে, সুতরাং আপনার ক্ষেত্রে এটি কেবল নিজের দ্বারা কাস্টম বাস্তবায়নের বিষয় হিসাবে অন্য উত্তরগুলি নির্দেশ করেছে। মাইক্রোসফ্ট কেন ডিফল্টরূপে এটি প্যাক করে না, এটির জন্য সংখ্যার সংখ্যার কম সংখ্যার কথা চিন্তা করুন think

delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(T1 obj1, out T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, out T2 obj2)

মাত্র দুটি পরামিতি জন্য। আমরা স্পর্শও করি নি ref। এটি আসলে বিকাশকারীদের জন্য জটিল এবং বিভ্রান্তিকর হবে।


2
মনে রাখবেন যে সি # ফাংশন ওভারলোডিং delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)এবং এর মধ্যে পার্থক্য করতে পারে না delegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)। সুতরাং ওভারলোডের সংখ্যার পাশাপাশি চিহ্নের নাম মাইক্রোসফ্ট কেন এই ওভারলোডগুলি যুক্ত করতে পারে নি তার অন্য কারণ Func
ক্যাস্পার ভ্যান ডেন বার্গ

উপরের প্রতিনিধিদের সম্পর্কে কেউ আমাকে একটি এমএসডিএন নিবন্ধে রেফার করতে পারেন?
সু ললেভলিন

@ সুলেওল্লিন আমি মূল এমএসডিএন নিবন্ধটি খুঁজে পেতে পারিনি, তবে আপনি চেষ্টা করতে পারেন: ডকস.মাইক্রোসফটকম / en
us/

0

আপনি এটিকে একটি ল্যাম্বডা / ডেলিগেট / ফাংশন / পদ্ধতিতে মোড়াতে পারেন যা সঠিক ইন্টারফেসটি উন্মোচিত করেছিল এবং ফাইন্ডফোরবার নামে পরিচিত, তবে আমার সন্দেহ যে ফাইন্ডফোরবার একটি কারণ হিসাবে একটি আউট প্যারামিটার হিসাবে গণনা করেছে, সুতরাং আপনার অবশ্যই নিশ্চিত হওয়া দরকার যে তথ্যটি ফেলে দেওয়া হয়েছিল ঠিক আছে / নিরাপদ / আকাঙ্ক্ষিত / সঠিক ফলাফল পেয়েছে (আপনি যদি সরাসরি সন্ধান ফোরবারে সরাসরি পাস করতে পারেন তবে আপনার এটি নিশ্চিত হওয়া দরকার)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.