সি # জেনেরিক ত্রুটিতে সহায়তা - "টাইপ 'টি' অবশ্যই একটি নন-মানযোগ্য মানের ধরণ হতে হবে"


100

আমি সি # তে নতুন এবং নীচের কোডটি কেন কাজ করে না তা বুঝতে পারি না।

public static Nullable<T> CoalesceMax<T>(Nullable<T> a, Nullable<T> b) where T : IComparable
{
    if (a.HasValue && b.HasValue)
        return a.Value.CompareTo(b.Value) < 0 ? b : a;
    else if (a.HasValue)
        return a;
    else
        return b;
}

// Sample usage:
public DateTime? CalculateDate(DataRow row)
{
    DateTime? result = null;
    if (!(row["EXPIRATION_DATE"] is DBNull))
        result = DateTime.Parse((string)row["EXPIRATION_DATE"]);
    if (!(row["SHIPPING_DATE"] is DBNull))
        result = CoalesceMax(
            result
            DateTime.Parse((string)row["SHIPPING_DATE"]).AddYears(1));
    // etc.
    return result;
}

সংকলনের সময় এটি নিম্নলিখিত ত্রুটিটি দেয়:

জেনেরিক টাইপ বা পদ্ধতিতে সিস্টেম 'প্যারামিটার' টি হিসাবে এটি ব্যবহার করতে 'টাইপ' টাইপটি অবশ্যই একটি নন-অযোগ্য মান ধরণের হতে হবে।

1
সংকলক ত্রুটি আপনাকে ফাংশন সংজ্ঞায়নের লাইন দেয় কারণ সেখানেই ত্রুটি।
এসএলএক্স

উত্তর:


180

আপনাকে একটি T : structসীমাবদ্ধতা যুক্ত করতে হবে:

public static Nullable<T> CoalesceMax<T>
    (Nullable<T> a, Nullable<T> b) where T : struct, IComparable

অন্যথায় সি # এর Nullable<T>অর্থ কী তা বোঝার চেষ্টা করবে এবং বুঝতে পারবে যে এটি ইতিমধ্যে Nullable<T>নিজের দ্বারা সীমাবদ্ধতার প্রয়োজন নেই । অন্য কথায়, আপনি কল করার চেষ্টা করতে পারেন:

CoalesceMax<string>(...)

যা কার্যকর হবে না, যেমনটি Nullable<string>বৈধ নয়।


16

Nullable<T>যে ধরনের প্রয়োজন এটি একটি বাধ্যতা রয়েছে T(ক মান টাইপ করা structC #)। এই কারণেই সংকলকটি আপনাকে Nullable<T>আপনার ফাংশন বা সেই ফাংশনের কল সাইট সম্পর্কে নয় এবং বলছে - এটি এমন Nullableশ্রেণি যা ত্রুটির মূল কারণ, সুতরাং এটি আসলে আরও সহায়ক যে যদি সংকলকটি কেবল আপনার ফাংশনটির দিকে ইঙ্গিত করে এবং বলে "এটি ঠিক নয়, ঠিক করুন!" (কল্পনা করুন যে CoalesceMaxবেশ কয়েকটি জেনেরিক ব্যবহার করা হয়েছে এবং সেগুলির মধ্যে কেবল একটিতে এই সীমাবদ্ধতা লঙ্ঘন করা হয়েছে - কোন জেনেরিকের এক বা একাধিক প্রতিবন্ধকতাগুলি কেবল ভেঙে গেছে তা জানার চেয়ে কোন জেনেরিকের সীমাবদ্ধতা ভেঙেছিল তা আরও কার্যকর CoalesceMax)।

সমাধানটি হ'ল একই সীমাবদ্ধতার পরিচয় দিয়ে আপনার Tএবং তাদের Tসামঞ্জস্য করা। এটি structসীমাবদ্ধতা যোগ করে করা হয় , যা অবশ্যই সমস্ত ইন্টারফেস / নতুন সীমাবদ্ধতার আগে আসতে হবে:

public static Nullable<T> CoalesceMax<T>(Nullable<T> a, Nullable<T> b) where T : struct, IComparable{
  ...
}

6

আপনার জেনেরিক পদ্ধতিটি ব্যবহার করছে একটি Nullable<T>

যাইহোক, আপনি ধরণের সীমাবদ্ধ করছেন না T, সুতরাং এটি সত্তা শেষ হতে পারে Nullable<Form>, যা স্পষ্টতই অবৈধ।

কেবলমাত্র একটি মান ধরণের হতে where T : struct, IComparableপারে তা নিশ্চিত করার জন্য আপনার প্রতিবন্ধকতা পরিবর্তন Tকরতে হবে।


2

ওপি-র ঠিক কোনও উত্তর নয় তবে যেহেতু গুগলে একই ত্রুটি বার্তার জন্য এটিই প্রথম পপ আপ হয়েছিল, তাই আমার ক্লাসের সংজ্ঞাতে আমার পদ্ধতির পরিবর্তে আমাকে বাধা যুক্ত করতে হয়েছিল, যেমন

public class MyClass<T> where T : struct
{
    public void MyMethod(T? value)
    {
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.