সি # জেনেরিক বৈশিষ্ট্য প্রকারকে কেন নিষিদ্ধ করে?


510

এটি একটি সংকলন-সময় ব্যতিক্রম ঘটায়:

public sealed class ValidatesAttribute<T> : Attribute
{

}

[Validates<string>]
public static class StringValidation
{

}

আমি বুঝতে পারি যে সি # জেনেরিক গুণাবলী সমর্থন করে না। তবে অনেকটা গুগল করার পরেও আমি এর কারণ খুঁজে পাচ্ছি না।

জেনেরিক প্রকারগুলি কেন পাওয়া যায় না তা কি কেউ জানেন Attribute? কোন তত্ত্ব?


17
আপনি করতে পারেন [বৈধতা (টাইফফ (স্ট্রিং)] - আমি সম্মত
জেনেরিকগুলি আরও

20
যদিও এটি এই প্রশ্নের খুব দেরী সংযোজন, দুঃখের বিষয় যে এটি কেবল নিজের গুণাবলীই নয়, বিমূর্ত বৈশিষ্ট্য শ্রেণিগুলি (যা স্পষ্টতই গুণাবলী হিসাবে তাত্ক্ষণিকভাবে প্রবর্তন করা যায় না) এই জাতীয়ভাবে সংযুক্ত করা হয়: abstract class Base<T>: Attribute {}যা নন- জেনেরিক উত্সযুক্ত ক্লাসগুলি এর মতো:class Concrete: Base<MyType> {}
Lucero

88
আমি জেনেরিক বৈশিষ্ট্য এবং ল্যাম্বডাস গ্রহণের গুণাবলীর জন্য আগ্রহী। ভালো জিনিস কল্পনা [DependsOnProperty<Foo>(f => f.Bar)]বা [ForeignKey<Foo>(f => f.IdBar)]...
তারিখে Jacek ভয়ঙ্করী স্ত্রীলোক

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

উত্তর:


358

ঠিক আছে, কেন এটি উপলব্ধ নেই তা আমি উত্তর দিতে পারি না তবে আমি নিশ্চিত করতে পারি যে এটি কোনও সিএলআইয়ের সমস্যা নয়। সিএলআই স্পেকটি এটি উল্লেখ করে না (যতদূর আমি দেখতে পাচ্ছি) এবং আপনি সরাসরি আইএল ব্যবহার করলে আপনি একটি জেনেরিক বৈশিষ্ট্য তৈরি করতে পারেন। সি # 3 টিপকের অংশটি এটি নিষিদ্ধ করে - বিভাগ 10.1.4 "শ্রেণীর বেস নির্দিষ্টকরণ" কোনও ন্যায়সঙ্গততা দেয় না।

বর্ণিত ইসিএমএ সি # 2 স্পেস কোনও কার্যকর তথ্য দেয় না, যদিও এটি অনুমোদিত নয় তার উদাহরণ দেয়।

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

সম্পাদনা: এরিক লিপার্টের উত্তর (প্যারাফ্রেসড): কোনও বিশেষ কারণ নেই যা ব্যবহারের ক্ষেত্রে ভাষা এবং সংকলক উভয়ই জটিলতা এড়ানোর জন্য যা খুব বেশি মূল্য দেয় না।


139
"ভাষা এবং সংকলক উভয় ক্ষেত্রেই জটিলতা এড়ানো ছাড়া" ... এবং যে লোকেরা আমাদেরকে
সহকর্মিতা

254
"কেস ব্যবহার করুন যা বেশি মান যোগ করে না"? এটি একটি বিষয়গত মতামত, এটি আমাকে অনেক মূল্য সরবরাহ করতে পারে!
জন ক্রুর্গ

34
এই বৈশিষ্ট্যটি না রাখার বিষয়ে যে জিনিসটি আমাকে সবচেয়ে বেশি বিরক্ত করে তা [প্রপার্টি রেফারেন্স (x => x.SomeProperty)] এর মতো জিনিসগুলি করতে সক্ষম হয় না। পরিবর্তে, আপনার যাদু স্ট্রিং এবং টাইপফ () প্রয়োজন, যা আমি মনে করি এক ধরণের স্তন্যপান করি।
Asbjørn Ulsberg

13
@ জন: আমি মনে করি আপনি একটি নতুন ভাষা বৈশিষ্ট্য ডিজাইনিং, নির্দিষ্টকরণ, প্রয়োগকরণ এবং পরীক্ষার ব্যয়কে ব্যাপকভাবে অবমূল্যায়ন করেছেন।
জন স্কিটি

14
আমি কেবল @ টিমউইর প্রতিরক্ষাতে যুক্ত করতে চাই যে এগুলি নিয়েই কেবল আলোচনা করা হচ্ছে না এবং এই প্রশ্নে 13 কে মতামত সুস্থ স্তরের ইঙ্গিত দেয়। এছাড়াও: একটি প্রামাণিক উত্তর পাওয়ার জন্য ধন্যবাদ, জন।
জর্ডান গ্রে

84

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

আরও তথ্যের জন্য এই এমএসডিএন নিবন্ধটি দেখুন।


3
নিবন্ধটি পুনঃস্থাপন করে যে তারা সম্ভব নয়, তবে কারণ ছাড়াই। আমি আপনার উত্তরটি ধারণাগতভাবে বুঝতে পারি। আপনি কি এই বিষয়ে আরও কোনও অফিসিয়াল ডকুমেন্টেশন জানেন?
ব্রায়ান ওয়াটস

2
নিবন্ধটি এই সত্যটি আবৃত করে যে আইএলটিতে এখনও জেনেরিক স্থানধারক রয়েছে যা রানটাইমের সময় প্রকৃত ধরণের সাথে প্রতিস্থাপিত হয়। বাকিটি আমার দ্বারা অনুমিত হয়েছিল ... :)
গ্যালাকটিক

1
এটির মূল্য কীসের জন্য, ভিবি একই সীমাবদ্ধতা প্রয়োগ করে: "জেনেরিক বা জেনেরিক ধরণের অন্তর্ভুক্ত ক্লাস কোনও বৈশিষ্ট্য শ্রেণীর অন্তর্গত হতে পারে না" "
গ্যালাকটিক

1
ইসিএমএ -৩৩৪, বিভাগ ১৪.১6 বলছে "নীচে তালিকাভুক্ত প্রেক্ষাপটে নিয়মিত মত প্রকাশের প্রয়োজন এবং ধ্রুবক-এক্সপ্রেশন ব্যবহার করে এটি ব্যাকরণে নির্দেশিত হয়েছে। এই প্রসঙ্গে, একটি সংকলন-সময় ত্রুটি ঘটে যদি সংকলন-এ কোনও এক্সপ্রেশনটি পুরোপুরি মূল্যায়ন না করা যায়। সময়। " বৈশিষ্ট্যগুলি তালিকায় রয়েছে।
গ্যালাকটিক

4
এটি অন্য উত্তরের সাথে বিরোধী বলে মনে হচ্ছে যা জানিয়েছে যে আইএল এটির অনুমতি দেবে। ( Stackoverflow.com/a/294259/3195477 )
UuDdLrLrSs

21

কেন এটি অনুমোদিত নয় তা আমি জানি না, তবে এটি একটি সম্ভাব্য কাজ

[AttributeUsage(AttributeTargets.Class)]
public class ClassDescriptionAttribute : Attribute
{
    public ClassDescriptionAttribute(Type KeyDataType)
    {
        _KeyDataType = KeyDataType;
    }

    public Type KeyDataType
    {
        get { return _KeyDataType; }
    }
    private Type _KeyDataType;
}


[ClassDescriptionAttribute(typeof(string))]
class Program
{
    ....
}

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

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

13

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

//an interface which means it can't have its own implementation. 
//You might need to use extension methods on this interface for that.
public interface ValidatesAttribute<T>
{
    T Value { get; } //or whatever that is
    bool IsValid { get; } //etc
}

public class ValidatesStringAttribute : Attribute, ValidatesAttribute<string>
{
    //...
}
public class ValidatesIntAttribute : Attribute, ValidatesAttribute<int>
{
    //...
}

[ValidatesString]
public static class StringValidation
{

}
[ValidatesInt]
public static class IntValidation
{

}

8

এটি একটি খুব ভাল প্রশ্ন। বৈশিষ্ট্যাবলী সঙ্গে আমার অভিজ্ঞতা, আমি মনে করি বাধ্যতা জায়গায় কারণ যখন একটি বৈশিষ্ট্য অনুধ্যায়ী এটা একটি শর্ত যার মাধ্যমে আপনি সব সম্ভব টাইপ একাধিক বিন্যাসন জন্য চেক করতে হবে তৈরি করবে: typeof(Validates<string>),typeof(Validates<SomeCustomType>) , ইত্যাদি ...

আমার মতে, প্রকারের উপর নির্ভর করে যদি কাস্টম বৈধকরণের প্রয়োজন হয় তবে কোনও বৈশিষ্ট্য সেরা পদ্ধতির নাও হতে পারে।

প্যারামিটার হিসাবে একটি SomeCustomValidationDelegateবা একটিতে গ্রহণযোগ্যতা শ্রেণি সম্ভবত ISomeCustomValidatorআরও ভাল পদ্ধতির হতে পারে।


আমি আপনার সাথে একমত. আমার দীর্ঘদিন ধরে এই প্রশ্নটি ছিল এবং বর্তমানে একটি বৈধতা সিস্টেম তৈরি করছি। আমি প্রশ্নটি জিজ্ঞাসা করার জন্য আমার বর্তমান পরিভাষাটি ব্যবহার করেছি, তবে এই পদ্ধতির উপর ভিত্তি করে কোনও পদ্ধতির প্রয়োগের কোনও অভিপ্রায় নেই।
ব্রায়ান ওয়াটস

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

4
আপনি জেনেরিক ধরণের সংজ্ঞা (যেমন টাইফফ (বৈধতা <>)) এর বিরুদ্ধে পরীক্ষা করতে পারেন ...
মেলভিন

5

এটি বর্তমানে কোনও সি # ভাষার বৈশিষ্ট্য নয়, তবে সরকারী সি # ল্যাঙ্গুয়েজ রেপো নিয়ে অনেক আলোচনা রয়েছে

থেকে কিছু মিটিং নোট :

যদিও এটি নীতিগতভাবে কাজ করবে, রানটাইমের বেশিরভাগ সংস্করণে বাগ রয়েছে যাতে এটি সঠিকভাবে কাজ না করে (এটি কখনই ব্যবহার করা হয়নি)।

এটি কোন লক্ষ্য রানটাইমটি কাজ করে তা বোঝার জন্য আমাদের একটি প্রক্রিয়া প্রয়োজন। আমাদের এটি অনেক কিছুর জন্য প্রয়োজন এবং বর্তমানে এটি সন্ধান করছে। ততক্ষণে, আমরা এটি নিতে পারি না।

একটি বড় সি # সংস্করণের প্রার্থী, যদি আমরা এটির সাথে যথেষ্ট পরিমাণ রানটাইম সংস্করণগুলি ডিল করতে পারি।


1

আমার পরিশ্রম এইরকম কিছু:

public class DistinctType1IdValidation : ValidationAttribute
{
    private readonly DistinctValidator<Type1> validator;

    public DistinctIdValidation()
    {
        validator = new DistinctValidator<Type1>(x=>x.Id);
    }

    public override bool IsValid(object value)
    {
        return validator.IsValid(value);
    }
}

public class DistinctType2NameValidation : ValidationAttribute
{
    private readonly DistinctValidator<Type2> validator;

    public DistinctType2NameValidation()
    {
        validator = new DistinctValidator<Type2>(x=>x.Name);
    }

    public override bool IsValid(object value)
    {
        return validator.IsValid(value);
    }
}

...
[DataMember, DistinctType1IdValidation ]
public Type1[] Items { get; set; }

[DataMember, DistinctType2NameValidation ]
public Type2[] Items { get; set; }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.