असल में सी # में निम्नलिखित क्यों अमान्य है? मुझे इसके लिए बहुत अच्छे उपयोग मिल सकते हैं और वास्तव में इसे अपनी खुद की नामुमकिन संरचना वर्ग बनाकर ठीक कर सकते हैं, लेकिन सी # विनिर्देश (और इसलिए संकलक) क्यों और कैसे रोकता है?'संरचना Nullable <T>' संरचना क्यों नहीं है?
नीचे जो मैं बात कर रहा हूं उसका आंशिक उदाहरण नीचे दिया गया है।
struct MyNullable<T> where T : struct
{
public T Value;
public bool HasValue;
// Need to overide equals, as well as provide static implicit/explit cast operators
}
class Program
{
static void Main(string[] args)
{
// Compiles fine and works as expected
MyNullable<Double> NullableDoubleTest;
NullableDoubleTest.Value = 63.0;
// Also compiles fine and works as expected
MyNullable<MyNullable<Double>> NullableNullableTest;
NullableNullableTest.Value.Value = 63.0;
// Fails to compile...despite Nullable being a struct
// Error: The type 'double?' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'ConsoleApplication1.MyNullable<T>'
MyNullable<Nullable<Double>> MyNullableSuperStruct;
}
}
क्या आप पूछ रहे हैं कि आप एक निरर्थक शून्य क्यों नहीं बना सकते? शायद अगर आपने केवल कोड के बजाय * शब्दों * में प्रश्न का phrasing करने का प्रयास किया है, तो आप समझ जाएंगे कि यह अधिक समझ में क्यों नहीं आता है। –
@ एलबी यह एक सूचक के लिए सूचक के लिए एक सूचक के समान है। डबल पॉइंटर शून्य हो सकता है, पॉइंटर शून्य हो सकता है, या वे दोनों एक घाटी हो सकते हैं। संपादित करें: बेशक इसकी अनुमति नहीं है, इसलिए यह एक महत्वपूर्ण मुद्दा है। – Servy
मैंने आपके कोड को संकलित करने की कोशिश की (LINQPad में) और मुझे _ प्रकार 'int' मिलता है? ** जेनेरिक प्रकार या विधि 'UserQuery.MyNullable' _ में पैरामीटर 'टी' के रूप में इसका उपयोग करने के लिए ** एक गैर-शून्य मूल्य मान ** होना चाहिए। क्या आप इसे संकलित करने का प्रयास करते समय अलग हैं? –