नोट: ऐसा प्रतीत होता है कि रोज़लिन में तय किया गया था
यह सवाल तब पैदा हुआ जब करने के लिए अपने जवाब लिख यह एक है, जिनमें से संबद्धता के बारे में बात अशक्त-वालों ऑपरेटर ।
एक अनुस्मारक के रूप में, अशक्त-सहवर्ती ऑपरेटर का विचार यह है कि फॉर्म की एक अभिव्यक्ति
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
, सी बी, ए सी के लिए, और बी के लिए एक से रूपांतरण के साथ
मैं दूसरे मामले और तीसरे मामले को समझ सकता हूं ... लेकिन पहले मामले में अतिरिक्त ए से बी रूपांतरण क्यों है? विशेष रूप से, मैं वास्तव में पहले मामले और दूसरे मामले में एक ही बात होने की उम्मीद कर - यह सिर्फ एक स्थानीय चर में अभिव्यक्ति निकाल रहा है, आखिरकार।
क्या हो रहा है पर कोई लेने वाला? जब सी # कंपाइलर की बात आती है तो मैं "बग" रोने से बहुत हिचकिचाता हूं, लेकिन मैं इस बात पर अडिग हूं कि क्या हो रहा है ...
संपादित करें: ठीक है, यहाँ क्या हो रहा है इसका एक नास्टियर उदाहरण है, विन्यासकर्ता के उत्तर के लिए धन्यवाद, जो मुझे यह सोचने के लिए और कारण देता है कि यह एक बग है। संपादित करें: नमूना को अब दो अशक्त-संचालक ऑपरेटरों की भी आवश्यकता नहीं है ...
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")