দ্রষ্টব্য: এটি রোজলিনে স্থির করা হয়েছে বলে মনে হয়
এই প্রশ্নের উঠে যখন আমার উত্তর লেখার এই এক , যার মধ্যে associativity সম্পর্কে আলোচনা নাল-কোয়ালেসিং অপারেটর ।
একটি অনুস্মারক হিসাবে, নাল-কোলেসিং অপারেটরের ধারণা হ'ল ফর্মের একটি অভিব্যক্তি
x ?? y
প্রথমে মূল্যায়ন করুন x
, তারপরে:
- মানটি
x
যদি নালy
হয় তবে মূল্যায়ন করা হয় এবং এটিই অভিব্যক্তির শেষ ফলাফল - যদি মানটি
x
নন-নালy
হয় তবে মূল্যায়ন করা হয় না এবং এর মান হয়x
y
প্রয়োজনে সংকলন-সময়ের ধরণের রূপান্তর করার পরে প্রকাশের শেষ ফলাফল হয়
এখন সাধারণত কোনও রূপান্তরের প্রয়োজন হয় না, বা এটি কেবলমাত্র একটি প্রবণতা থেকে শুরু করে অ-শনাক্তযোগ্য - সাধারণত প্রকারগুলি একই রকম হয়, বা কেবল (বলুন) int?
থেকেint
। যাইহোক, আপনি আপনার নিজের অন্তর্নিহিত রূপান্তর অপারেটরগুলি তৈরি করতে পারেন এবং এটি প্রয়োজনীয় যেখানে ব্যবহৃত হয়।
এর সাধারণ মামলার জন্য x ?? y
, আমি কোনও বিজোড় আচরণ দেখিনি। যাইহোক, (x ?? y) ?? z
আমি কিছু বিভ্রান্তিকর আচরণ দেখতে।
এখানে একটি সংক্ষিপ্ত তবে সম্পূর্ণ পরীক্ষামূলক প্রোগ্রাম - ফলাফলগুলি মন্তব্যে রয়েছে:
using System;
public struct A
{
public static implicit operator B(A input)
{
Console.WriteLine("A to B");
return new B();
}
public static implicit operator C(A input)
{
Console.WriteLine("A to C");
return new C();
}
}
public struct B
{
public static implicit operator C(B input)
{
Console.WriteLine("B to C");
return new C();
}
}
public struct C {}
class Test
{
static void Main()
{
A? x = new A();
B? y = new B();
C? z = new C();
C zNotNull = new C();
Console.WriteLine("First case");
// This prints
// A to B
// A to B
// B to C
C? first = (x ?? y) ?? z;
Console.WriteLine("Second case");
// This prints
// A to B
// B to C
var tmp = x ?? y;
C? second = tmp ?? z;
Console.WriteLine("Third case");
// This prints
// A to B
// B to C
C? third = (x ?? y) ?? zNotNull;
}
}
সুতরাং আমাদের তিনটি কাস্টম মান প্রকার আছে A
,B
এবং C
, সি বি, একটি সি, এবং বি A থেকে ধর্মান্তর সঙ্গে
আমি দ্বিতীয় কেস এবং তৃতীয় কেস উভয়ই বুঝতে পারি ... তবে কেন প্রথম ক্ষেত্রে অতিরিক্ত A থেকে B রূপান্তর হয়? বিশেষত, আমি চাই সত্যিই প্রথম কেস এবং দ্বিতীয় কেসটি একই জিনিস হওয়ার প্রত্যাশা - এটি কেবল একটি স্থানীয় ভেরিয়েবলের মধ্যে একটি এক্সপ্রেশন বের করছে, সর্বোপরি।
কি চলছে তাতে কোন গ্রহণকারী? সি # কম্পাইলারের কথাটি শুনে আমি "বাগ" কাঁদতে চরম সংবেদনশীল, তবে কী হচ্ছে তা নিয়ে আমি স্তিমিত হয়েছি ...
সম্পাদনা: ঠিক আছে, এখানে যা চলছে তার একটি পূর্ববর্তী উদাহরণ, কনফিগারারের উত্তরকে ধন্যবাদ, যা আমাকে এটি একটি বাগ বলে মনে করার আরও কারণ দেয়। সম্পাদনা: নমুনার জন্য এখন পর্যন্ত দুটি নাল-কোলেসিং অপারেটর প্রয়োজন নেই ...
using System;
public struct A
{
public static implicit operator int(A input)
{
Console.WriteLine("A to int");
return 10;
}
}
class Test
{
static A? Foo()
{
Console.WriteLine("Foo() called");
return new A();
}
static void Main()
{
int? y = 10;
int? result = Foo() ?? y;
}
}
এর ফলাফল:
Foo() called
Foo() called
A to int
Foo()
এখানে দু'বার কল করা সত্যটি আমার কাছে বিস্ময়কর - আমি দু'বার অভিব্যক্তির মূল্যায়ন করার কোনও কারণ দেখতে পাচ্ছি না ।
C? first = ((B?)(((B?)x) ?? ((B?)y))) ?? ((C?)z);
। আপনি পাবেন:Internal Compiler Error: likely culprit is 'CODEGEN'
(("working value" ?? "user default") ?? "system default")