"স্পেশাল ক্লাস" আসলে কী?


114

সংকলনের জন্য নীচের মতো কিছু পেতে ব্যর্থ হওয়ার পরে:

public class Gen<T> where T : System.Array
{
}

ত্রুটি সহ

প্রতিবন্ধকতা বিশেষ শ্রেণি `সিস্টেম.আরে 'হতে পারে না

আমি হতাশ, ঠিক যা শুরু হয় একটি "বিশেষ শ্রেণীর"?

লোকেরা যখন System.Enumজেনেরিক সীমাবদ্ধতার মধ্যে নির্দিষ্ট করে থাকে তারা প্রায়শই একই ধরণের ত্রুটি পেয়ে থাকে । আমি একই ফলাফল পেয়েছেন System.Object, System.Delegate, System.MulticastDelegateএবং System.ValueTypeখুব।

তাদের আরও কি আছে? আমি সি # তে "বিশেষ শ্রেণি" তে কোনও তথ্য খুঁজে পাচ্ছি না।

এছাড়াও, কি হল ঐ শ্রেণীর সম্পর্কে তাই বিশেষ যে আমরা তাদের একটি জেনেরিক টাইপ বাধ্যতা হিসাবে ব্যবহার করতে পারছি না?


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

2
আমার অভিজ্ঞতায়, ক্লাসগুলি যেগুলি ব্যবহৃত হয় তবে আপনি সেগুলি সরাসরি ব্যবহার করতে পারবেন না, কেবল অন্য বাক্য বিন্যাসের মাধ্যমে, বিশেষ ক্লাস। এনুম একই বিভাগে পড়ে। কী তাদেরকে বিশেষ করে তোলে, আমি জানি না।
লাসে ভি কার্লসেন

@ অ্যান্ডি কোরনেয়েভ: এই প্রশ্নটি বিভিন্ন রকম। আমি একটি "বিশেষ শ্রেণি" এর সংজ্ঞা এবং / অথবা এগুলির একটি বিস্তৃত তালিকা চাইছি। এই প্রশ্নটি কেবল সিস্টেমের জন্যই জিজ্ঞাসা করে r
Mints97

ডকুমেন্টেশন থেকে এতে বলা হয়েছে "[...] কেবলমাত্র সিস্টেম এবং সংকলকগণ অ্যারে শ্রেণি থেকে স্পষ্টতই পেতে পারেন।" এটি সম্ভবত এটিই এটি একটি বিশেষ শ্রেণি করে তোলে - এটি সংকলক দ্বারা এটি বিশেষভাবে চিকিত্সা করা হয়।
আরবি।

1
@ আরবি: ভুল এই লজিক মানে হবে System.Objectহয় না একটি "বিশেষ শ্রেণী", এই বৈধ: public class X : System.Object { }কিন্তু System.Objectএখনও একটি "বিশেষ শ্রেণীর" হয়।
Mints97

উত্তর:


106

রোজলিন উত্স কোড থেকে, এটি হার্ডকোডযুক্ত ধরণের তালিকার মতো দেখাচ্ছে:

switch (type.SpecialType)
{
    case SpecialType.System_Object:
    case SpecialType.System_ValueType:
    case SpecialType.System_Enum:
    case SpecialType.System_Delegate:
    case SpecialType.System_MulticastDelegate:
    case SpecialType.System_Array:
        // "Constraint cannot be special class '{0}'"
        Error(diagnostics, ErrorCode.ERR_SpecialTypeAsBound, syntax, type);
        return false;
}

উত্স: বাইন্ডার_সাইনট্রেটস.সি.এস.ভালিডকন্ট্রেন্ট টাইপ
আমি এটি একটি গিটহাব অনুসন্ধান ব্যবহার করে পেয়েছি: "একটি সীমাবদ্ধতা বিশেষ শ্রেণি হতে পারে না"


1
সংকলক আউটপুট (যা এই প্রশ্নটি উদ্ধৃত করা অবহেলা করে) এবং অন্যান্য উত্তরগুলিতে দেখা যায়, @ কোবি 702 সংকলক ত্রুটি CS0702 হয়ে যায়।
আকাশম

1
@ আকাশম - ধন্যবাদ! আমি কম্পাইল করার চেষ্টা করেছি এবং কোনও কারণে ত্রুটি নম্বরটি পাইনি। এরপরে এটি জানতে আমাকে প্রায় 5 মিনিট সময় লেগেছে , এবং আমার মন্তব্য সম্পাদনা করার জন্য পর্যাপ্ত সময় নেই। দুঃখের গল্প.
কোবি

1
@ কোবি: আপনাকে আউটপুট- উইন্ডোটি দেখতে হবে, সেখানে আপনি সঠিক সংকলক ত্রুটি কোড নম্বরটি খুঁজে পাবেন CS0702
টিম শ্মেলটার

9
তাহলে এখন আসল প্রশ্ন হচ্ছে এই বিশেষ ক্লাসগুলি কেন ?
ডেভিড

@ ডেভিডগ্রিনবার্গ সম্ভবত কারণ হতে পারে আপনি সরাসরি (এই ব্যতীত object) এই ধরণের থেকে উত্তরাধিকারী হতে পারবেন না , বা কমপক্ষে এর সাথে কিছু করার আছে। এছাড়াও where T : ArrayAssay কে T হিসাবে পাস করার অনুমতি দেবে, যা সম্ভবত বেশিরভাগ মানুষ চান।
IllidanS4

42

অনুরূপ প্রশ্নের জন্য আমি ২০০৩ সালের জন স্কিটির মন্তব্য পেয়েছি: System.Enumসীমাবদ্ধতা কেন সমর্থিত নয়

আমি জানি এটি একটি সামান্য বিষয় , তবে তিনি এরিক লিপার্টকে (সি # দল) জিজ্ঞাসা করেছিলেন এবং তারা এই উত্তরটি দিয়েছেন:

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

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

তবে সময়সূচী বিধিনিষেধের কারণে আমরা সম্ভবত ভাষার পরবর্তী সংস্করণে এই বৈশিষ্ট্যগুলি পেতে সক্ষম হব না।


10
@ ইউয়ালআইটজচকভ - গিথুব \ এমএসডিএনকে উদ্ধৃত করা কি আরও ভাল? সি # টিম ইস্যু বা এর মতো একটি সম্পর্কিত একটি শক্ত উত্তর দিয়েছে..এটি সত্যই কাউকে আঘাত করতে পারে না। জন স্কিটি সবেমাত্র সেগুলি উদ্ধৃত করেছে এবং এটি যখন সি # তে পৌঁছে যায় তখন বেশ নির্ভরযোগ্য
আমির পপোভিচ

5
মন খারাপ করার দরকার নেই। এর অর্থ এই নয় যে এটি একটি বৈধ উত্তর নয় :) কেবলমাত্র জোনস্কিট ভিত্তিতে আমার চিন্তাভাবনাগুলি ভাগ করে নিচ্ছিলাম; পি
যুবাল ইতজচকভ

40
এফওয়াইআই বিটিডাব্লু আমি মনে করি আপনিই এখানে উদ্ধৃত করছেন। :-)
এরিক লিপার্ট

2
@ এরিকলিপার্ট - এটি উক্তিটিকে আরও নির্ভরযোগ্য করে তুলেছে।
আমির পপোভিচ

উত্তরের লিঙ্কের ডোমেনটি মারা গেছে।
পাং

25

এমএসডিএন অনুসারে এটি ক্লাসগুলির একটি স্থির তালিকা:

সংকলক ত্রুটি CS0702

প্রতিবন্ধকতা বিশেষ শ্রেণীর 'সনাক্তকারী' হতে পারে না নিম্নলিখিত ধরণের সীমাবদ্ধতা হিসাবে ব্যবহার করা যাবে না:

  • System.Object
  • System.Array
  • System.Delegate
  • System.Enum
  • System.ValueType।

4
শীতল, সঠিক উত্তর মত মনে হচ্ছে, ভাল খুঁজে! তবে System.MulticastDelegateতালিকায় কোথায়?
Mints97

8
@ Mints97: কোন ধারণা নেই, সম্ভবত ডকুমেন্টেশনের অভাব?
টিম শ্মেলটার

দেখে মনে হচ্ছে আপনি এই ক্লাস থেকে উত্তরাধিকারী হতে পারবেন না।
ডেভিড ক্লেম্পফনার

14

সি # 4.0 অনুযায়ী ভাষা নির্দিষ্টকরণ (কোডড: [10.1.5] প্যারামিটারের সীমাবদ্ধতাগুলি টাইপ করুন) দুটি জিনিস বলে:

1] প্রকারটি অবশ্যই অবজেক্ট হওয়া উচিত নয়। যেহেতু সমস্ত ধরণের অবজেক্ট থেকে উদ্ভূত, যদি এর অনুমতি দেওয়া হয় তবে এই জাতীয় সীমাবদ্ধতার কোনও প্রভাব পড়বে না।

2] টিতে কোনও প্রাথমিক বাধা বা টাইপ পরামিতি সীমাবদ্ধতা না থাকলে এর কার্যকর বেস শ্রেণিটি অবজেক্ট।

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

public class Gen<T> where T : class
{
}

এটি জেনেরিক প্রকারকে মান ধরণের হতে বাধা দেয় যেমন ইন্ট বা স্ট্রাক্ট ইত্যাদি type

এছাড়াও, সীমাবদ্ধতা বিশেষ শ্রেণীর 'সনাক্তকারী' হতে পারে না নিম্নলিখিত ধরণের সীমাবদ্ধতা হিসাবে ব্যবহার করা যাবে না:

  • System.Object
  • System.Array
  • System.Delegate
  • System.Enum
  • System.ValueType।

12

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

যদি, উদাহরণস্বরূপ, এক ক্লিক করুন অনুমতি দেওয়া হয়েছে: void CopyArray<T>(T dest, T source, int start, int count); এক পাস destএবং sourceএমন পদ্ধতিতে সক্ষম হতে পারে যা একটি আর্গুমেন্ট টাইপের আশা করে System.Array; এরপরে, একটি সংকলন-সময় বৈধতা পেতে পারে destএবং এটি sourceছিল উপযুক্ত সামঞ্জস্যপূর্ণ অ্যারে, কিন্তু একজন []অপারেটর ব্যবহার করে অ্যারের উপাদানগুলিতে অ্যাক্সেস করতে সক্ষম হবে না ।

Arrayবাধা হিসাবে ব্যবহারে অক্ষমতা প্রায়শই কাজ করা বেশ সহজ, যেহেতু void CopyArray<T>(T[] dest, T[] source, int start, int count)পূর্বের পদ্ধতিটি প্রায় সমস্ত পরিস্থিতিতে কাজ করবে work এটির অবশ্য দুর্বলতা রয়েছে: পূর্বের পদ্ধতিটি দৃশ্যে কাজ করবে যে System.Arrayআর্গুমেন্টগুলি অসম্পূর্ণ অ্যারে প্রকারের ক্ষেত্রে প্রত্যাখ্যান করার সময় একটি বা উভয় যুক্তিই ধরণের ছিল ; উভয় যুক্তিই প্রকারভেদ ছিল এমন একটি ওভারলোড যুক্ত System.Arrayকরার ফলে কোডটি গ্রহণ করা উচিত এমন অতিরিক্ত ক্ষেত্রে মেনে নেবে, তবে এটি ভুলের সাথে এটি গ্রহণযোগ্য কেসগুলিও গ্রহণ করবে।

আমি বেশিরভাগ বিশেষ প্রতিবন্ধকতা অস্বীকার করার সিদ্ধান্তটি খুঁজে পাই। যার একমাত্র শূন্য অর্থ অর্থ হবে System.Object[যেহেতু এটি যদি সীমাবদ্ধতা হিসাবে আইনী হত তবে যে কোনও কিছুই এটি সন্তুষ্ট করবে]। System.ValueTypeসম্ভবত খুব দরকারী হবে না, যেহেতু প্রকারের উল্লেখগুলির ValueTypeসাথে মান ধরণেরগুলির সাথে খুব বেশি মিল নেই, তবে প্রতিফলনের সাথে জড়িত ক্ষেত্রে এটির সম্ভবত যুক্তিযুক্ত কিছু মূল্য থাকতে পারে। উভয়ই System.Enumএবং এর System.Delegateকিছু বাস্তব ব্যবহার রয়েছে, তবে যেহেতু সি # এর নির্মাতারা সেগুলি ভেবে দেখেন নি যে তারা কোনও উপযুক্ত কারণে অবৈধ ed


10

নিম্নলিখিত সিএলআরে সি # চতুর্থ সংস্করণের মাধ্যমে পাওয়া যাবে:

প্রাথমিক বাধা

একটি ধরণের পরামিতি শূন্য প্রাথমিক বাধা বা একটি প্রাথমিক সীমাবদ্ধতা নির্দিষ্ট করতে পারে। একটি প্রাথমিক সীমাবদ্ধতা একটি রেফারেন্স টাইপ হতে পারে যা এমন কোনও শ্রেণি সনাক্ত করে যা সিল করা হয় নি। : আপনি নিম্নলিখিত বিশেষ উল্লেখসহ ধরনের এক নির্দিষ্ট করতে পারেন না System.Object , System.Array , System.Delegate , System.MulticastDelegate , System.ValueType , System.Enum , অথবা System.Void । রেফারেন্স ধরণের সীমাবদ্ধতা নির্দিষ্ট করার সময় আপনি সংকলককে প্রতিশ্রুতি দিচ্ছেন যে একটি নির্দিষ্ট ধরণের আর্গুমেন্ট হয় একই ধরণের বা সীমাবদ্ধতা ধরণের থেকে প্রাপ্ত কোনও প্রকারের।


আরও দেখুন: সি # ls অধ্যায় 10.1.4.1: একটি বর্গ ধরনের সরাসরি বেস বর্গ নিম্নলিখিত প্রকারের কোন হবে না: System.Array, System.Delegate, System.MulticastDelegate, System.Enum, অথবা System.ValueType। তদুপরি, জেনেরিক শ্রেণির ঘোষণাটি System.Attributeপ্রত্যক্ষ বা পরোক্ষ বেস শ্রেণীরূপে ব্যবহার করতে পারে না ।
জেরোইন ভেনেভেল

5

আমি মনে করি না, "বিশেষ শ্রেণি" / "বিশেষ ধরণের" এর কোনও অফিসিয়াল সংজ্ঞা আছে।

আপনি তাদের সম্পর্কে বিভিন্ন ধরণের সম্পর্কে ভাবতে পারেন, যা "নিয়মিত" ধরণের সংকেতের সাথে ব্যবহার করা যায় না:

  • আপনি এগুলি সরাসরি ইনস্ট্যান্ট করতে পারবেন না;
  • আপনি সরাসরি তাদের কাছ থেকে কাস্টম ধরণের উত্তরাধিকারী হতে পারবেন না;
  • তাদের সাথে কাজ করার জন্য কিছু সংকলক যাদু রয়েছে (allyচ্ছিকভাবে);
  • তাদের দৃষ্টান্তগুলির প্রত্যক্ষ ব্যবহার কমপক্ষে অব্যর্থ (allyচ্ছিকভাবে; কল্পনা করুন, আপনি উপরে জেনেরিক তৈরি করেছেন, আপনি কোন জেনেরিক কোডটি লিখতে চলেছেন?)

PS আমি System.Voidতালিকায় যুক্ত করব।


2
System.Voidজেনেরিক সীমাবদ্ধতা হিসাবে ব্যবহৃত হয় যখন সম্পূর্ণ ভিন্ন ত্রুটি দেয় =)
Mints97

@ Mints97: সত্য। তবে যদি প্রশ্নটি "বিশেষ" সম্পর্কে হয় তবে হ্যাঁ, voidখুব বিশেষ। :)
ডেনিস

@ ডেনিস: কোডটিতে একটি ধরণের কয়েকটি পরামিতি রয়েছে যা System.Arrayপদ্ধতিগুলি ব্যবহার করতে পারে যেমন Array.Copyএক থেকে অন্যটিতে ডেটা স্থানান্তরিত করতে পারে; কোনও ধরণের প্যারামিটার সহ কোড তাদের System.Delegateব্যবহার করতে সক্ষম হবে এবং ফলাফলটি যথাযথ টাইপ করতে পারবে । জেনেরিক পরিচিত ধরণের কার্যকরভাবে ব্যবহার করা এই জাতীয় প্রতিটি ধরণের জন্য একবার প্রতিবিম্ব ব্যবহার করবে তবে জেনেরিক পদ্ধতিটি নন-জেনেরিক পদ্ধতির চেয়ে 10x দ্রুত হতে পারে। Delegate.CombineEnumHasAnyFlag
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.