ভ্যালুটুপল কোভারিয়েন্ট কী করে?


35

এটি সি # 7.3 (ফ্রেমওয়ার্ক 4.8) এ সঠিকভাবে সংকলন করেছে:

(string, string) s = ("a", "b");
(object, string) o = s;

আমি জানি যে এটি নিম্নলিখিতগুলির জন্য সিনট্যাকটিক চিনি, যা সঠিকভাবে সংকলন করে:

ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;

সুতরাং, এটা মনে হয় যে ValueTuples নিয়োগ করা যেতে পারে covariantly , যা সন্ত্রস্ত !

দুর্ভাগ্যক্রমে, আমি বুঝতে পারছি না কেন : আমি এই ছাপে ছিলাম যে সি # কেবল ইন্টারফেস এবং প্রতিনিধিদের মধ্যে স্ববিরোধিতা সমর্থন করেValueTypeনা হয়।

আসলে, যখন আমি আমার নিজস্ব কোড দিয়ে এই বৈশিষ্ট্যটির সদৃশ করার চেষ্টা করি, তখন আমি ব্যর্থ হই:

struct MyValueTuple<A, B>
{
    public A Item1;
    public B Item2;

    public MyValueTuple(A item1, B item2)
    {
        Item1 = item1;
        Item2 = item2;
    }
}

...

MyValueTuple<string, string> s = new MyValueTuple<string, string>("a", "b");
MyValueTuple<object, string> o = s;
// ^ Cannot implicitly convert type 'MyValueTuple<string, string>' to 'MyValueTuple<object, string>'

সুতরাং, কেন ValueTupleসমবায়ভাবে বরাদ্দ করা যেতে পারে, তবে এসগুলি MyValueTupleপারে না?


2
এই মাত্র তুমি কেমন ধার্য করতে পারেন মত কম্পাইলার দ্বারা সম্ভবত বিশেষ চিকিত্সা হয় nullএকটি থেকে Nullable<T>যদিও এটি একটি struct আছে।
জুন 14

2
আসলে, বিযুক্ত কোডটি দ্বিতীয় অ্যাসাইনমেন্টের মতো দেখায়:ValueTuple<object, string> o = new ValueTuple<object, string>(s.Item1, s.Item2);
ল্যাসে ভি। কার্লসেন

2
টিপলগুলি অদ্ভুত এবং কোনও অন্তর্নিহিত সিএলআর উপস্থাপনার উপর নির্ভর করার পরিবর্তে সি # সংকলক সামনের প্রান্তে সম্পূর্ণভাবে প্রয়োগ করা হয়। এই অ্যাসাইনমেন্ট অপারেটর আপনি যা ভাবেন তা করছে না।
জেরেমি লেকম্যান

2
একটি public static implicit operator MyValueTuple<A, B>(MyValueTuple<string, string> v) { throw new NotImplementedException(); }কার্যনির্বাহী অপারেটরটিকে তার কার্য-ডিকনস্ট্রাকচার যুক্ত করুন। এছাড়াও, উপায় দ্বারা দুর্দান্ত প্রশ্ন!
ěŕxěŕ

1
@ Ěŕxěŕ ষাঁড়ের চোখ! এটি এটিকে সংকলনযোগ্য করে তোলে, এবং ব্যতিক্রমটি প্রত্যাশা অনুযায়ী নিক্ষেপ করা হয়
মং ঝু

উত্তর:


25

আমি বিশ্বাস করি এখানে আসলে যা ঘটছে তা হ'ল একটি ধ্বংসাত্মক কার্য ment টুপল অ্যাসাইনমেন্ট তার উপাদানগুলিকে স্পষ্টত রূপান্তরিত করার চেষ্টা করবে, এবং যেহেতু এটি নির্ধারণ stringকরা সম্ভব হয় object, এখানেই এটি ঘটে।

ভাষা একই রকম সংখ্যক উপাদানগুলির দ্বীপপুঞ্জের মধ্যে অ্যাসাইনমেন্ট সমর্থন করে, যেখানে প্রতিটি ডান হাতের উপাদানটি সুস্পষ্টভাবে এর সাথে সম্পর্কিত বাম-হাতের উপাদানটিতে রূপান্তরিত হতে পারে। অন্যান্য রূপান্তরগুলি অ্যাসাইনমেন্টের জন্য বিবেচনা করা হয় না।

সূত্র

শার্পল্যাব.ওয়ে এটি দেখুন


4
আমি শুধু SharpLab তে এটি চেষ্টা এবং নিশ্চিত যথেষ্ট এটা ঠিক যে আছে
জন

3
কেবল এটিকে আরও শক্তিশালী করার জন্য, ওপির আসল উদাহরণে, আপনি যদি sটাইপ করে পরিবর্তন করেন(string, object) এটিই এটি রূপান্তর ত্রুটির ফলস্বরূপ, আইটেমগুলির মধ্যে অন্তর্নিহিত রূপান্তর ঘটছে এবং ইঙ্গিত করে স্ট্রিং স্পষ্টভাবে স্ট্রিংয়ে রূপান্তরিত হতে পারে তবে বিপরীতে নয়।
এরিক ইজারা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.