"দশমিক" কেন একটি বৈধ বৈশিষ্ট্য প্যারামিটার ধরণ নয়?


139

এটি সত্যই অবিশ্বাস্য হলেও বাস্তব। এই কোডটি কাজ করবে না:

[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)]
public class Range : Attribute
{
    public decimal Max { get; set; }
    public decimal Min { get; set; }
}

public class Item
{
    [Range(Min=0m,Max=1000m)]  //compile error:'Min' is not a valid named attribute argument because it is not a valid attribute parameter type 
    public decimal Total { get; set; }  
}

এটি যখন কাজ করে:

[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)]
public class Range : Attribute
{
    public double Max { get; set; }
    public double Min { get; set; }
}

public class Item
{
    [Range(Min=0d,Max=1000d)]
    public decimal Total { get; set; }  
}

দশমিক না থাকাকালীন কেন দ্বিগুণ হয় আমাকে কে বলতে পারে।


উত্তর:


139

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

এই উত্তরটি জেয়ারডপার থেকে নেওয়া ।

দশমিকগুলি যখন কোনও মৌলিক প্রকারটি কোনও আদিম ধরণের নয় এবং তাই তাকে মেটাডেটাতে উপস্থাপন করা যায় না যা এটিকে একটি অ্যাট্রিবিউট প্যারামিটার হতে বাধা দেয়।


35
দশমিকগুলি সিএলআর-তে আদিম ধরণের হিসাবে বিবেচনা করা হয় না কেন?
কৌমাইড

10
@ কৌমাইডস আমি বিশ্বাস করি যে উত্তরটি একমাত্র সিপিইউ রেজিস্ট্রারে 128 বিট হওয়ায় প্রকাশের পক্ষে প্রকারটি খুব বড়
ক্রিস মেরিসিক

2
ঠিক আছে তাই স্ট্রিংগুলিকে অ্যাট্রিবিউটর বৈশিষ্ট্য হিসাবে অনুমোদিত কেন? আমি মনে করি এটি 'আদিম
শ্রেণির

স্ট্রিংগুলি রেফারেন্স টাইপ যা সম্পূর্ণ ভিন্নভাবে পরিচালিত হয়।
কার্স্টেন শ্যুট

2
@ সোরেন এটি সত্য নয়, Enumসমর্থিত। আমার কাছে বর্তমানে 2 টি কাস্টম অ্যাট্রিবিউটস রয়েছে যার মধ্যে একটি 2 এনাম এবং অন্যরা এনুমের অ্যারে রয়েছে।
ফ্রাঙ্ক

60

চশমা থেকে :

কোনও অ্যাট্রিবিউট শ্রেণীর অবস্থানগত এবং নামযুক্ত পরামিতিগুলির প্রকারগুলি অ্যাট্রিবিউট প্যারামিটার ধরণের মধ্যে সীমাবদ্ধ, যা হ'ল:

  • নিম্নলিখিত প্রকারের একটি: bool, byte, char, double, float, int, long, sbyte, short, string, uint, ulong, ushort
  • প্রকার object
  • প্রকার System.Type
  • একটি এনাম টাইপ, তবে এতে জনসাধারণের অ্যাক্সেসযোগ্যতা থাকে এবং যে ধরণের ক্ষেত্রে এটি নেস্ট করা হয় (যদি থাকে তবে) জনসাধারণের অ্যাক্সেসযোগ্যতাও রয়েছে (অ্যাট্রিবিউট স্পেসিফিকেশন)।
  • উপরের ধরণের একক মাত্রিক অ্যারে

10
সঠিক, তবে মনে রাখবেন যে আপনি অনুমানের একটি পুরানো সংস্করণ উদ্ধৃত করছেন। C # এর সংস্করণ 3.0, 4.0, এবং 5.0, এটি বলা এটি প্রকার থাকা করতে পারে sbyte, ushort, uint, ulong। এবং এটি ঠিক কাজ করা বলে মনে হচ্ছে। তবে এখনও decimalঅনুমোদিত নয় :-(
জেপ্পি স্টিগ নীলসন

1
@ জেপ্পস্টিগ নিলসেন আমি নির্দিষ্ট লিঙ্কটি এবং উদ্ধৃতি আপডেট করেছি
ওহাদ স্নাইডার

6
অযোগ্য আদিমরাও সমর্থিত নয়।
কেটিসিও

2

এই সমস্যার উত্তরটি হল স্ট্রিংগুলি ব্যবহার করা, যা পারমাণবিক ধরণের না হয়েও বৈশিষ্ট্য হিসাবে অনুমোদিত। দ্বিগুণ ব্যবহার করবেন না কারণ গোলগুলি ফলাফলকে কম নির্ভুল করে তুলবে।

public String MinimumValue
{
    get
    {
        return minimumValueDecimal.ToString();
    }

    set
    {
        minimumValueDecimal = Decimal.Parse(value);
    }
}

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