सामान्य प्रकार या विधि 'System.Nullable <T>' में पैरामीटर T के रूप में उपयोग करने के लिए 'स्ट्रिंग' एक गैर-अशक्त प्रकार होना चाहिए।


172

मुझे त्रुटि क्यों मिलती है "सामान्य प्रकार या विधि 'System.Nullable' में पैरामीटर 'T' के रूप में उपयोग करने के लिए" टाइप 'स्ट्रिंग एक गैर-अशक्त मान होना चाहिए?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Universe;

namespace Universe
{
    public class clsdictionary
    {
      private string? m_Word = "";
      private string? m_Meaning = "";

      string? Word { 
          get { return m_Word; }
          set { m_Word = value; }
      }

      string? Meaning { 
          get { return m_Meaning; }
          set { m_Meaning = value; }
      }
    }
}

21
Stringपहले से ही अशक्त है।
एम। बॉबॉक

जवाबों:


204

अपने कोड में सभी स्थानों के stringबजाय उपयोग करें string?

Nullable<T>प्रकार की आवश्यकता है कि टी गैर-व्यर्थ मान प्रकार, उदाहरण के लिए है intया DateTime। जैसे संदर्भ प्रकार stringपहले से ही अशक्त हो सकते हैं। चीजों को अनुमति देने का कोई मतलब नहीं होगा, Nullable<string>इसलिए यह अस्वीकृत है।

यदि आप C # 3.0 या बाद में उपयोग कर रहे हैं, तो आप ऑटो-कार्यान्वित गुणों का उपयोग करके अपने कोड को सरल बना सकते हैं :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}

1
M.Babcock, जब मैं m_Word = null करता हूं, तो यह त्रुटि करता है, कोई सुझाव? मैं Word को अशक्त करने में सक्षम होना चाहता हूं।
MiscellaneousUser

1
@ विविधकार्य: आपको क्या त्रुटि संदेश मिलता है? क्या आप उस सटीक फ़ाइल को पोस्ट कर सकते हैं जिसे आपने संकलित करने की कोशिश की थी? यह अनुमान लगाना कठिन है कि आपके कोड की केवल एक पंक्ति को देखने से आपकी गलती क्या है। मेरा मतलब है कि यह हो सकता है कि आप एक अर्ध-बृहदान्त्र को याद कर रहे हैं ... लेकिन शायद आप इसे कॉपी + पेस्ट करना भूल गए हैं ... यह अनुमान लगाने के अलावा कुछ भी नहीं है जब तक आप उस कोड को पोस्ट नहीं करते हैं जिसे आपने संकलित करने की कोशिश की थी।
मार्क बायर्स

मदद के लिए धन्यवाद, इस पोस्ट को देखा stackoverflow.com/questions/187406/… और देख सकते हैं कि प्रश्न चिह्न केवल मूल्य प्रकारों के लिए है।
MiscellaneousUser

@ विविध प्रकार: यह केवल "मूल्य प्रकारों के लिए" नहीं है। यह विशेष रूप से एक गैर-अशक्त मूल्य प्रकार होना चाहिए । जिस तरह त्रुटि संदेश कहता है।
मार्क बायर्स

1
हेह, थोड़ी देर के लिए स्विफ्ट प्रोग्रामिंग करने के बाद, यह एक मुझे सी # प्रोजेक्ट पर सबसे अच्छा मिला।
अल्बर्ट बोरी

52

stringएक संदर्भ प्रकार है, एक वर्ग है। आप केवल गैर-अशक्त मूल्य प्रकार जैसे और के साथ C # सिंथैटिक चीनी का उपयोग Nullable<T>या कर सकते हैं ।T?intGuid

विशेष रूप से, जैसा stringकि एक संदर्भ प्रकार है, प्रकार की अभिव्यक्ति stringपहले से ही अशक्त हो सकती है:

string lookMaNoText = null;

15

System.String (पूंजी एस के साथ) पहले से ही अशक्त है, आपको इसे इस तरह से घोषित करने की आवश्यकता नहीं है।

(string? myStr) गलत है।


कैपिटल लेटर के महत्व को उजागर करने के लिए, आपके उत्तर के लिए छोटा एडिट। मैं C # में नया हूं और मुझे इस छोटे से अंतर के लिए हमेशा के लिए ले लिया गया।
बी - रियान

4

एक बहुत ही विशिष्ट कारण के Nullable<int>लिए, अपने कर्सर को Nullable पर रखें और F12 को हिट करें - मेटाडेटा कारण प्रदान करता है (संरचना की कमी पर ध्यान दें):

public struct Nullable<T> where T : struct
{
...
}

http://msdn.microsoft.com/en-us/library/d5x73970.aspx


4
ध्यान दें कि एक संरचना होने के Nullable<Nullable<int>>बावजूद भी यह अस्वीकृत Nullable<int>है।
मार्क बायर्स

यह तो दिलचस्प है। संकलक में वह "हार्ड-कोडेड" है? यह एक विशिष्ट संरचना (Nullable <Nullable <... >>) से कैसे विवश है? - संपादित करें अब मैं स्पष्ट रूप से यह विशेष रूप से देख रहा हूं - संकलन त्रुटि ... एक गैर-अशक्त मूल्य प्रकार होना चाहिए ....
जोशुआ एनफील्ड

4

कृपया ध्यान दें कि C # के आगामी संस्करण में जो 8 है, उत्तर सही नहीं हैं।

All the reference types are non-nullable by default और आप वास्तव में निम्नलिखित कर सकते हैं:

public string? MyNullableString; 
this.MyNullableString = null; //Valid

तथापि,

public string MyNonNullableString; 
this.MyNonNullableString = null; //Not Valid and you'll receive compiler warning. 

यहां महत्वपूर्ण बात यह है कि आपके कोड का इरादा दिखाना है। यदि "आशय" यह है कि संदर्भ प्रकार अशक्त हो सकता है, तो इसे चिह्नित करें अन्यथा अन्यथा अशक्त करने के लिए अशक्त मान निर्दिष्ट करने के परिणामस्वरूप संकलक चेतावनी होगी।

और जानकारी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.