সি # স্যুইচ এক্সপ্রেশন বিভিন্ন ফলাফল ফিরে


13

আমি আমার একটি প্রকল্পে সি # 8 এ চলেছি। এবং আমি আমার সমস্ত switchবিবৃতি প্রকাশের দিকে নিয়ে চলেছি । তবে আমি জানতে পেরেছিলাম যে আমার প্রকল্পটি ভিন্নভাবে কাজ শুরু করেছে এবং আমি জানতে পেরেছি যে এটি switchপ্রকাশের কারণে । উদাহরণস্বরূপ এই কোডটি পেতে দেয়

class Program
{
    public enum DataType
    {
        Single,
        Double,
        UInt16,
        UInt32,
        UInt64,
        Int16,
        Int32,
        Int64,
        Byte
    }

    static void Main(string[] args)
    {
        dynamic value1 = 5;
        dynamic value2 = 6;

        var casted = CastToType(value1, DataType.Int16);
        var casted1 = CastToTypeExpression(value2, DataType.Int16);


        var type = casted.GetType(); // Int16
        var type1 = casted1.GetType(); // Double
        var bytes = BitConverter.GetBytes(casted); // byte arr with 2 el => [5, 0] <- expected behavior 
        var bytes1 = BitConverter.GetBytes(casted1); // byte arr with 8 el => [0, 0, 0, 0, 0, 0, 24, 64]
    }

    public static dynamic CastToType(dynamic value, DataType type)
    {
        switch (type)
        {
            case DataType.Byte:
                return (byte)value;
            case DataType.Double:
                return (double)value;
            case DataType.Int16:
                return (short)value;
            case DataType.Int32:
                return (int)value;
            case DataType.Int64:
                return (long)value;
            case DataType.Single:
                return (float)value;
            case DataType.UInt16:
                return (ushort)value;
            case DataType.UInt32:
                return (uint)value;
            case DataType.UInt64:
                return (ulong)value;
            default: throw new InvalidCastException();
        }
    }

    public static dynamic CastToTypeExpression(dynamic value, DataType type)
    {
        return type switch
        {
            DataType.Byte => (byte)value,
            DataType.Double => (double)value,
            DataType.Int16 => (short)value,
            DataType.Int32 => (int)value,
            DataType.Int64 => (long)value,
            DataType.Single => (float)value,
            DataType.UInt16 => (ushort)value,
            DataType.UInt32 => (uint)value,
            DataType.UInt64 => (ulong)value,
            _ => throw new InvalidCastException(),
        };
    }
}

আমি ফলাফলটি একটি মন্তব্য হিসাবে লিখেছি, তবে tl; dr যখন ক্লাসিক সুইচ ব্যবহার করা হয় তখন মানটি প্রত্যাশিত প্রকারের মধ্যে ফেরত দেয়, তবে যখন স্যুইচ এক্সপ্রেশন ব্যবহৃত হয় তখন এটি "ডাবল" টাইপের প্রকার দেয়, ফলস্বরূপ প্রাপ্ত হওয়ার সময় ভিন্ন byte[]হয় মান বাইট।

দুজনের মধ্যে পার্থক্য কী? আমি কী মিস করি?


1
কেন হয় এবং কীভাবে হয় আমি ঠিক তা ব্যাখ্যা করতে পারি না তবে এখানে আপনার কোডটির একটি বিগলিত সংস্করণটি দেখুন ( gist.github.com/MaDOS/4904683d461d022e4b24f4080009ae5e ) আপনি লক্ষ্য করেছেন যে সংকলকটি দেখে মনে হয়েছে যে সমস্ত সম্ভাব্য প্রত্যাবর্তনের ধরণগুলি এক্সপ্রেশনটি একটি ডাবল হয়ে যাবে এবং স্বয়ংক্রিয়ভাবে একটি ডাবল ঘোষণা করবে যেখানে ফলাফলটি ফিরে আসবে তা যেখানে তা সংরক্ষণ করবে। ( gist.github.com/MADOS/… )
— রবিন বি

উত্তর:


17

আপনার সুইচ বিবৃতি ফর্মটিতে, প্রতিটি বাহু সরাসরি একটি মান ফিরিয়ে দিচ্ছে। এটি সংখ্যার প্রকার থেকে সরাসরি রূপান্তরিত হয় object, কারণ এটি কার্যকরভাবে পদ্ধতির রিটার্ন টাইপ।

আপনার সুইচ এক্সপ্রেশন ফর্মটি কিছুটা আলাদা। এটি প্রথমে স্যুইচ এক্সপ্রেশন থেকে ফলাফল বের করে, তারপরে ফলাফলটিকে ঘোষিত রিটার্নের ধরণে রূপান্তর করে। সুতরাং সুইচ এক্সপ্রেশন ধরনের কি? এটি স্যুইচ এক্সপ্রেশনটির বাহুতে পৃথক প্রকাশের সমস্ত ধরণের থেকে "সেরা" টাইপ।

এই সমস্ত প্রকারেরই স্পষ্টত রূপান্তরিত হতে পারে double(যা নিজেই এক ধরণের), তাই এটি সর্বোত্তম টাইপ। সুতরাং আপনার সুইচ এক্সপ্রেশন পদ্ধতি সমান:

public static dynamic CastToTypeExpression(dynamic value, DataType type)
{
    double result = type switch
    {
        DataType.Byte => (byte)value,
        DataType.Double => (double)value,
        DataType.Int16 => (short)value,
        DataType.Int32 => (int)value,
        DataType.Int64 => (long)value,
        DataType.Single => (float)value,
        DataType.UInt16 => (ushort)value,
        DataType.UInt32 => (uint)value,
        DataType.UInt64 => (ulong)value,
        _ => throw new InvalidCastException(),
    };
    return result;
}

সুস্পষ্টভাবে টাইপ করা অ্যারেগুলি ব্যবহার না করে আপনি একটি "সুইচ এক্সপ্রেশন" ব্যবহার না করেই এই "সেরা টাইপ" দেখতে পারেন:

var array = new[]
{
    (byte) 0, 0.0, (short) 0, 0,
    0L, 0f, (ushort) 0, 0U, 0UL
};

এখানে প্রকারটি arrayঅনুমান করা হয় double[]।

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