সি # তে জেনেরিক আর্গুমেন্টের নাল বা ডিফল্ট তুলনা


288

আমার জেনেরিক পদ্ধতিটি এর মতো সংজ্ঞায়িত হয়েছে:

public void MyMethod<T>(T myArgument)

আমি প্রথমে যা করতে চাই তা হ'ল মাইআরগমেন্টের মান সেই ধরণের জন্য ডিফল্ট মান কিনা তা এই জাতীয়:

if (myArgument == default(T))

তবে এটি সংকলন করে না কারণ আমি গ্যারান্টি দিইনি যে টি == অপারেটরটি প্রয়োগ করবে। সুতরাং আমি কোডটিতে এই পরিবর্তন করেছি:

if (myArgument.Equals(default(T)))

এখন এই সংকলনগুলি, তবে মাইআরগমেন্টটি শূন্য হলে ব্যর্থ হবে, যা আমি যা পরীক্ষা করছি তারই একটি অংশ। আমি এর মতো একটি স্পষ্ট নাল চেক যুক্ত করতে পারি:

if (myArgument == null || myArgument.Equals(default(T)))

এখন এটি আমার কাছে অপ্রয়োজনীয় বোধ করে। রিশার্পার এমনকি এমনও পরামর্শ দিচ্ছে যে আমি MyArgument == নাল অংশটি আমার অ্যারগমেন্ট == ডিফল্ট (টি) এ পরিবর্তন করি যা আমি শুরু করেছি। এই সমস্যা সমাধানের জন্য আরও ভাল উপায় আছে?

রেফারেন্সের ধরণ এবং মান ধরণের উভয়কেই আমার সমর্থন করা দরকার ।


সি # এখন নাল শর্তসাপেক্ষ অপারেটরকে সমর্থন করে যা আপনার দেওয়া শেষ উদাহরণের জন্য সিনট্যাটিক চিনি। আপনার কোড হয়ে যাবে if (myArgument?.Equals( default(T) ) != null )
উইজার্ড07 কেএসইউ

1
@ উইজার্ড07 কেএসইউ এটি মান ধরণের জন্য কাজ করে না, অর্থাত্ যে trueকোনও ক্ষেত্রে মূল্যায়ন করে কারণ Equalsসর্বদা মান ধরণের জন্য ডাকা হবে কারণ যেহেতু এই ক্ষেত্রে myArgumentনাও হতে পারে nullএবং Equals(বুলিয়ান) ফলাফল কখনই আসবে না null
জ্যাস্পার

সমান মূল্যবান প্রায়-সদৃশ (তাই ভোটদান বন্ধ করার পক্ষে নয়): অপারেটর == সি # তে জেনেরিক ধরণের ক্ষেত্রে প্রয়োগ করা যাবে না?
জিসার্গ

উত্তর:


582

বক্সিং এড়ানোর জন্য, সাম্যের জন্য জেনেরিকের তুলনা করার সেরা উপায়টি হল EqualityComparer<T>.Default। এটি IEquatable<T>পাশাপাশি (বক্সিং ছাড়াই) সম্মান করে object.Equalsএবং সমস্ত Nullable<T>"উত্তোলিত" बारीকগুলি পরিচালনা করে। অত: পর:

if(EqualityComparer<T>.Default.Equals(obj, default(T))) {
    return obj;
}

এটি মিলবে:

  • ক্লাস জন্য নাল
  • নাল (খালি) জন্য Nullable<T>
  • অন্যান্য স্ট্রোকের জন্য শূন্য / মিথ্যা / ইত্যাদি

28
বাহ, কত সুন্দরভাবে অস্পষ্ট! এটি অবশ্যই যাওয়ার উপায়, যদিও।
নিক ফারিনা

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

13
দুর্দান্ত উত্তর! আরও ভাল কোডের এই লাইনটির জন্য একটি এক্সটেনশান পদ্ধতি যুক্ত করা হচ্ছে যাতে আপনি আপত্তি করতে পারেন sসডফাল্টফোরটাইপ ()
রিকো

2
@ নওফালের ক্ষেত্রে Person, এটি জনসাধারণের API এ p1.Equals(p2)প্রয়োগ করে কিনা IEquatable<Person>বা স্পষ্টত প্রয়োগের মাধ্যমে নির্ভর করবে - যেমন সংকলকটি পাবলিক Equals(Person other)পদ্ধতি দেখতে পাবে see যাহোক; মধ্যে জেনেরিক্স , একই আইএল সব জন্য ব্যবহার করা হয় T; একটি T1যা বাস্তবায়নের ক্ষেত্রে ঘটে তার সাথে IEquatable<T1>একইভাবে চিকিত্সা করা T2দরকার যা না হয় - তাই না, এটি কোনও পদ্ধতি স্পষ্ট করবে না , এটি Equals(T1 other)রানটাইমটিতে উপস্থিত থাকলেও। উভয় ক্ষেত্রেই null(উভয় বস্তু) সম্পর্কেও ভাবতে হবে। জেনেরিকের সাথে, আমি পোস্ট করা কোডটি ব্যবহার করব।
মার্ক গ্র্যাভেল

5
এই উত্তর আমাকে উন্মাদনা থেকে দূরে সরিয়ে দিয়েছে বা কাছাকাছি নিয়ে গেছে কিনা আমি সিদ্ধান্ত নিতে পারছি না। +1
স্টিভেন লাইকেন্স 15

118

এটি সম্পর্কে:

if (object.Equals(myArgument, default(T)))
{
    //...
}

static object.Equals()পদ্ধতিটি ব্যবহার করা আপনার nullনিজের চেক করার প্রয়োজনটিকে এড়িয়ে চলে । object.আপনার প্রসঙ্গের উপর নির্ভর করে সম্ভবত কলটির সাথে স্পষ্টভাবে যোগ্যতা অর্জনের প্রয়োজন নেই, তবে staticকোডটি আরও দ্রবণীয় করার জন্য আমি সাধারণত টাইপের নামের সাথে কলগুলি উপসর্গ করি ।


2
এমনকি আপনি "অবজেক্ট" টি ফেলে দিতে পারেন। অংশটি যেহেতু এটি অনর্থক। যদি (সমান (আমারআরগমেন্ট, ডিফল্ট (টি)))
স্টেফান

13
সত্য, এটি সাধারণত হয় তবে প্রসঙ্গের উপর নির্ভর করে না। এখানে একটি উদাহরণ সমান () পদ্ধতি থাকতে পারে যা দুটি আর্গুমেন্ট নেয়। আমি ক্লাসের নাম সহ সমস্ত স্থির কলকে স্পষ্টভাবে উপসর্গের প্রবণতা করি, যদি কেবল কোডটি পড়া সহজ করা যায়।
কেন্ট বুগার্ট


2
ইতিমধ্যে বাক্সযুক্ত পূর্ণসংখ্যা ব্যবহার করার সময় আমার পক্ষে এটি কার্যকর হয় না। কারণ এটি তখন একটি অবজেক্ট হবে এবং অবজেক্টের জন্য ডিফল্ট 0 এর পরিবর্তে বাতিল হয়ে যাবে
রিজেজবসচ

28

আমি একটি মাইক্রোসফ্ট সংযোগ নিবন্ধ সনাক্ত করতে সক্ষম হয়েছিল যা এই সমস্যাটি কিছুটা বিশদে আলোচনা করে:

দুর্ভাগ্যক্রমে, এই আচরণটি ডিজাইনের দ্বারা হয় এবং মান ধরণের ধরণের পরামিতিগুলির সাথে ব্যবহারের সক্ষম করার সহজ সমাধান নেই is

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

public class Test<T> where T : Exception

যদি প্রকারগুলি মান ধরণের হিসাবে পরিচিত হয় তবে ব্যবহৃত সঠিক ধরণের ভিত্তিতে নির্দিষ্ট মান সমতা পরীক্ষা করে। এখানে কোনও ভাল "ডিফল্ট" তুলনা নেই যেহেতু রেফারেন্স তুলনাগুলি মান ধরণের ক্ষেত্রে অর্থপূর্ণ নয় এবং সংকলকটি নির্ধারণ করতে পারে না যে কোন নির্দিষ্ট মানের তুলনা নির্গত হয়। সংকলকটি ValueType.Equals (অবজেক্ট) এ কল পাঠাতে পারে তবে এই পদ্ধতিটি প্রতিবিম্বটি ব্যবহার করে এবং নির্দিষ্ট মান তুলনার তুলনায় বেশ অকার্যকর। অতএব, আপনি যদি টি-তে কোনও মান-ধরণের সীমাবদ্ধতা নির্দিষ্ট করে থাকেন তবে কম্পাইলারের এখানে উত্পন্ন করার পক্ষে যুক্তিসঙ্গত কিছুই নেই:

public class Test<T> where T : struct

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

আপনি যা করতে পারেন তা এখানে ...

আমি বৈধতা দিয়েছি যে এই দুটি পদ্ধতিই রেফারেন্স এবং মান ধরণের জেনেরিক তুলনার জন্য কাজ করে:

object.Equals(param, default(T))

অথবা

EqualityComparer<T>.Default.Equals(param, default(T))

"==" অপারেটরের সাথে তুলনা করতে আপনাকে এই পদ্ধতির একটি ব্যবহার করতে হবে:

টি এর সমস্ত ক্ষেত্রে যদি জানা বেস ক্লাস থেকে নেওয়া হয় তবে আপনি জেনেরিক ধরণের বিধিনিষেধ ব্যবহার করে সংকলককে জানতে দিতে পারেন।

public void MyMethod<T>(T myArgument) where T : MyBase

সংকলকটি তখন কীভাবে অপারেশন করতে হবে তা সনাক্ত করে MyBaseএবং "অপারেটর '==' ফেলে দেবে না 'টি' এবং 'টি'" ত্রুটির টাইপের অপারেন্ডগুলিতে প্রয়োগ করা যাবে না যা আপনি এখন দেখছেন।

আরেকটি বিকল্প হ'ল টি প্রয়োগ করা হয় এমন যে কোনও ধরণের সীমাবদ্ধ IComparable

public void MyMethod<T>(T myArgument) where T : IComparable

এবং তারপরে আইকোম্যাপেবল ইন্টারফেসCompareTo দ্বারা নির্ধারিত পদ্ধতিটি ব্যবহার করুন ।


4
"এই আচরণটি নকশা দ্বারা হয় এবং মান ধরণের থাকতে পারে এমন ধরণের পরামিতিগুলির সাথে ব্যবহারের সক্ষম করার সহজ সমাধান নেই" " আসলে মাইক্রোসফ্ট ভুল। একটি সহজ সমাধান রয়েছে: বিএসওয়াই অপারেটর হিসাবে মান ধরণের ক্ষেত্রে এমএসের সিএইচ অপকোডটি প্রসারিত করা উচিত। তারপরে তারা এমন একটি অন্তর্নিহিত সরবরাহ করতে পারে যা কেবল এই অপকোড ব্যবহার করে, উদাহরণস্বরূপ অবজেক্ট B বিটওয়াইরিঅরফারেন্সইকুয়ালস <টি> (মান, ডিফল্ট (টি)) যা কেবল সিকিউ ব্যবহার করে। মান এবং রেফারেন্স উভয় প্রকারের জন্য এটি মানটির বিটওয়াইয়া সমতা পরীক্ষা করতে পারে (তবে রেফারেন্স ধরণের ক্ষেত্রে, রেফারেন্স বিটওয়াইজ সমতা বস্তুর সমান। রেফারেন্সএকুইয়ালস)
কিওয়ার্টি

1
আমি মনে করি মাইক্রোসফট কানেক্ট লিংক আপনি চেয়েছিলেন ছিল connect.microsoft.com/VisualStudio/feedback/details/304501/...
Qwertie

18

এটা চেষ্টা কর:

if (EqualityComparer<T>.Default.Equals(myArgument, default(T)))

এটি সংকলন করা উচিত এবং আপনি যা চান তা করা উচিত।


<কোড> ডিফল্ট (টি) </code> অপ্রয়োজনীয় নয়? <code> EqualityComparer <T>। Default.Equals (myArgument) </code> এর কৌশলটি করা উচিত।
জোশকোডস

2
1) আপনি এটি চেষ্টা করে দেখেছেন এবং 2) আপনি কীসের তুলনা করছেন, তার সাথে তুলনামূলক বস্তুটি? Equalsপদ্ধতি IEqualityComparerদুটি আর্গুমেন্ট লাগে, দুটি বস্তুর তুলনা করতে, তাই না, এটা অপ্রয়োজনীয় নয়।
লাসে ভি কার্লসেন

এটি গ্রহণযোগ্য উত্তর আইএমএইচওর চেয়ে আরও ভাল কারণ এটি বক্সিং / আনবক্সিং এবং অন্যান্য ধরণের পরিচালনা করে। দেখুন এই প্রশ্ন 'উত্তর "হিসেবে প্রতারিত বন্ধ": stackoverflow.com/a/864860/210780
ashes999

7

(সম্পাদিত)

মার্ক গ্র্যাভেলের সর্বোত্তম উত্তর রয়েছে তবে আমি এটি প্রদর্শনের জন্য একটি সাধারণ কোড স্নিপেট পোস্ট করতে চেয়েছিলাম। এটি কেবল একটি সাধারণ সি # কনসোল অ্যাপে চালান:

public static class TypeHelper<T>
{
    public static bool IsDefault(T val)
    {
         return EqualityComparer<T>.Default.Equals(obj,default(T));
    }
}

static void Main(string[] args)
{
    // value type
    Console.WriteLine(TypeHelper<int>.IsDefault(1)); //False
    Console.WriteLine(TypeHelper<int>.IsDefault(0)); // True

    // reference type
    Console.WriteLine(TypeHelper<string>.IsDefault("test")); //False
    Console.WriteLine(TypeHelper<string>.IsDefault(null)); //True //True

    Console.ReadKey();
}

আরও একটি বিষয়: ভিএস ২০০৮ সহ কেউ কি এটি একটি এক্সটেনশন পদ্ধতি হিসাবে চেষ্টা করতে পারেন? আমি এখানে 2005 এর সাথে আটকে আছি এবং আমি এটি আগ্রহী কিনা তা জানতে আগ্রহী।


সম্পাদনা: এটি কীভাবে একটি এক্সটেনশন পদ্ধতি হিসাবে কাজ করবে তা এখানে:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // value type
        Console.WriteLine(1.IsDefault());
        Console.WriteLine(0.IsDefault());

        // reference type
        Console.WriteLine("test".IsDefault());
        // null must be cast to a type
        Console.WriteLine(((String)null).IsDefault());
    }
}

// The type cannot be generic
public static class TypeHelper
{
    // I made the method generic instead
    public static bool IsDefault<T>(this T val)
    {
        return EqualityComparer<T>.Default.Equals(val, default(T));
    }
}

3
এটি এক্সটেনশন পদ্ধতি হিসাবে "কাজ" করে। এটি আকর্ষণীয় কারণ যেহেতু আপনি o.IsDefault <object> () বলছেন এমনকি যদি ও নাল হয় works ভীতিজনক =)
নিক ফারিনা

6

টি যেখানে আদিম টাইপ সহ সমস্ত ধরণের টি হ্যান্ডেল করতে আপনাকে তুলনার উভয় পদ্ধতিতে সংকলন করতে হবে:

    T Get<T>(Func<T> createObject)
    {
        T obj = createObject();
        if (obj == null || obj.Equals(default(T)))
            return obj;

        // .. do a bunch of stuff
        return obj;
    }

1
নোট করুন যে ফাংশনটি Func <T> গ্রহণ এবং টি ফিরে আসার জন্য পরিবর্তন করা হয়েছে, যা আমার মনে হয় ভুলবশত প্রশ্নকারীর কোড থেকে বাদ দেওয়া হয়েছিল।
নিক ফারিনা

দেখে মনে হচ্ছে রিশার্পার আমার সাথে ঝামেলা করছে। কোনও মান ধরণের এবং শূন্যের মধ্যে সম্ভাব্য তুলনা সম্পর্কে এর সতর্কতা উপলব্ধি করা যায়নি এটি সংকলক সতর্কতা নয়।
নাথান রিডলি

2
এফওয়াইআই: টি যদি মান মান হিসাবে প্রমাণিত হয় তবে নলের বিপরীতে তুলনাটি জিটার দ্বারা সর্বদা মিথ্যা হিসাবে বিবেচিত হবে।
এরিক লিপার্ট

অর্থবোধ করে - রানটাইমটি কোনও পয়েন্টারের সাথে একটি মানের ধরণের তুলনা করে। সমতুল্য () চেকটি তবে সেই ক্ষেত্রে কাজ করে (মজার বিষয়, যেহেতু এটি 5 গিগাবাইট (4) যা সংকলন করে) বলতে খুব গতিময়-ভাষা বলে মনে হয়।
নিক ফারিনা

2
বক্সিং এর সাথে জড়িত না এমন বিকল্পের জন্য সমতা কম্প্যাকার <টি> উত্তর দেখুন
মার্ক গ্রাভেল

2

এখানে একটি সমস্যা হতে চলেছে -

আপনি যদি এটিকে কোনও প্রকারের জন্য কাজ করার অনুমতি প্রদান করতে চলেছেন তবে ডিফল্ট (টি) রেফারেন্স ধরণের জন্য সর্বদা শূন্য হবে এবং মান ধরণের জন্য 0 (বা স্ট্রাক্ট 0 পূর্ণ) will

যদিও এটি সম্ভবত আপনার পরে করা আচরণ নয়। আপনি যদি এটি জেনেরিক উপায়ে কাজ করতে চান তবে আপনার টিয়ের ধরণটি পরীক্ষা করতে রিফ্লেকশন ব্যবহার করতে হবে এবং রেফারেন্সের ধরণের চেয়ে পৃথক মানের মান হ্যান্ডেল করতে হবে।

বিকল্পভাবে, আপনি এটিতে একটি ইন্টারফেস সীমাবদ্ধতা রাখতে পারেন, এবং ইন্টারফেসটি শ্রেণি / কাঠামোর ডিফল্ট বিরুদ্ধে পরীক্ষা করার একটি উপায় সরবরাহ করতে পারে।


1

আমি মনে করি আপনার সম্ভবত এই যুক্তিটি দুটি অংশে বিভক্ত করা উচিত এবং প্রথমে নালটি পরীক্ষা করা উচিত।

public static bool IsNullOrEmpty<T>(T value)
{
    if (IsNull(value))
    {
        return true;
    }
    if (value is string)
    {
        return string.IsNullOrEmpty(value as string);
    }
    return value.Equals(default(T));
}

public static bool IsNull<T>(T value)
{
    if (value is ValueType)
    {
        return false;
    }
    return null == (object)value;
}

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

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

এই পদ্ধতিগুলি ব্যবহার করে, নিম্নলিখিত কোডটি আপনার প্রত্যাশা মতো আচরণ করে:

class Program
{
    public class MyClass
    {
        public string MyString { get; set; }
    }

    static void Main()
    {
        int  i1 = 1;    Test("i1", i1); // False
        int  i2 = 0;    Test("i2", i2); // True
        int? i3 = 2;    Test("i3", i3); // False
        int? i4 = null; Test("i4", i4); // True

        Console.WriteLine();

        string s1 = "hello";      Test("s1", s1); // False
        string s2 = null;         Test("s2", s2); // True
        string s3 = string.Empty; Test("s3", s3); // True
        string s4 = "";           Test("s4", s4); // True

        Console.WriteLine();

        MyClass mc1 = new MyClass(); Test("mc1", mc1); // False
        MyClass mc2 = null;          Test("mc2", mc2); // True
    }

    public static void Test<T>(string fieldName, T field)
    {
        Console.WriteLine(fieldName + ": " + IsNullOrEmpty(field));
    }

    // public static bool IsNullOrEmpty<T>(T value) ...

    // public static bool IsNull<T>(T value) ...
}

1

গৃহীত উত্তরের উপর ভিত্তি করে এক্সটেনশন পদ্ধতি।

   public static bool IsDefault<T>(this T inObj)
   {
       return EqualityComparer<T>.Default.Equals(inObj, default);
   }

ব্যবহার:

   private bool SomeMethod(){
       var tValue = GetMyObject<MyObjectType>();
       if (tValue == null || tValue.IsDefault()) return false;
   }

সরল করার জন্য নাল দিয়ে বিকল্প:

   public static bool IsNullOrDefault<T>(this T inObj)
   {
       if (inObj == null) return true;
       return EqualityComparer<T>.Default.Equals(inObj, default);
   }

ব্যবহার:

   private bool SomeMethod(){
       var tValue = GetMyObject<MyObjectType>();
       if (tValue.IsNullOrDefault()) return false;
   }

0

আমি ব্যবহার করি:

public class MyClass<T>
{
  private bool IsNull() 
  {
    var nullable = Nullable.GetUnderlyingType(typeof(T)) != null;
    return nullable ? EqualityComparer<T>.Default.Equals(Value, default(T)) : false;
  }
}

-1

এটি আপনার প্রয়োজনীয়তাগুলির সাথে কাজ করে কিনা তা জানেন না তবে আপনি টি কে এমন ধরণের হতে বাধ্য করতে পারেন যা আইকোম্যাপেবলের মতো একটি ইন্টারফেস প্রয়োগ করে এবং তারপরে সেই ইন্টারফেসের (যা আইআইআরসি সমর্থন করে / নালগুলি পরিচালনা করে) তুলনা টো () পদ্ধতিটি ব্যবহার করে could :

public void MyMethod<T>(T myArgument) where T : IComparable
...
if (0 == myArgument.ComparesTo(default(T)))

সম্ভবত অন্যান্য ইন্টারফেস রয়েছে যা আপনি যেমন আইকুয়েবল ইত্যাদি ব্যবহার করতে পারেন


ওপি নালারফেরান এক্সেকশন সম্পর্কে চিন্তিত এবং আপনি তাকে একই গ্যারান্টি দিচ্ছেন।
নওফাল

-2

@ilitirit:

public class Class<T> where T : IComparable
{
    public T Value { get; set; }
    public void MyMethod(T val)
    {
        if (Value == val)
            return;
    }
}

অপারেটর '==' টি 'টি' এবং 'টি' টাইপের অপারেন্ডগুলিতে প্রয়োগ করা যাবে না

আমি সমান পদ্ধতি বা অবজেক্টটি অনুসরণ করে স্পষ্ট নাল পরীক্ষা না করে এটি করার কোনও উপায়ের কথা ভাবতে পারি না above উপরের পরামর্শ অনুসারে পরীক্ষাগুলি qu

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


-3

আমার মনে হয় আপনি খুব কাছে এসেছিলেন

if (myArgument.Equals(default(T)))

এখন এই সংকলনগুলি, তবে myArgumentশূন্য হলে ব্যর্থ হবে , যা আমি যা পরীক্ষা করছি তারই একটি অংশ। আমি এর মতো একটি স্পষ্ট নাল চেক যুক্ত করতে পারি:

আপনাকে কেবল সেই অবজেক্টটি রিভার্স করতে হবে যার উপরে সমানকে মার্জিত নাল-নিরাপদ পদ্ধতির জন্য ডাকা হচ্ছে।

default(T).Equals(myArgument);

আমি ঠিক একই জিনিস চিন্তা ছিল।
ক্রিস গেসলার 21

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