일반 유형 또는 메소드 'System.Nullable <T>'에서 매개 변수 T로 사용하려면 'string'유형은 널 입력 불가능 유형이어야합니다.


172

"일반 형식 또는 메서드 'System.Nullable'에서 매개 변수 'T'로 사용하려면 'string'형식이 nullable이 아닌 값 형식이어야합니다."오류가 발생하는 이유는 무엇입니까?

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이미 nullable입니다.
M.Babcock

답변:


204

코드의 모든 장소 string대신에 사용하십시오 string?.

Nullable<T>타입 T는 예를 들면, 비 - 널 값 유형 것을 요구 int하거나 DateTime. 같은 참조 유형 string은 이미 null 일 수 있습니다. 같은 것들을 가능하게 아무 소용이 없을 것 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를 null로 설정할 수 있기를 원합니다.
MiscellaneousUser

1
@MiscellaneousUser : 어떤 오류 메시지가 나타 납니까? 컴파일하려는 정확한 파일을 게시 할 수 있습니까? 한 줄의 코드 만 보면 실수가 무엇인지 추측하기 어렵습니다. 세미콜론이 누락되었을 수 있습니다 ...하지만 복사하거나 붙여 넣는 것을 잊어 버렸습니다 ... 컴파일하려고 시도한 코드를 게시 할 때까지 추측 일뿐입니다.
Mark Byers

도움을 주셔서 감사합니다.이 게시물 stackoverflow.com/questions/187406/… 을보고 물음표가 값 유형 전용임을 알 수 있습니다.
MiscellaneousUser

@MiscellaneousUser : "값 유형용"이 아닙니다. 특히 널 입력 불가능 값 유형 이어야합니다 . 오류 메시지가 말한 것처럼.
Mark Byers

1
Heh, 잠시 동안 Swift를 프로그래밍 한 후 C # 프로젝트에서 가장 좋았습니다.
Albert Bori

52

string참조 유형, 클래스입니다. 만 사용할 수 있습니다 Nullable<T>또는 T?비 - 널 (NULL)와 C # 문법 설탕 과 같은 유형 intGuid.

특히, string참조 형식과 마찬가지로 형식의 식은 string이미 null 일 수 있습니다.

string lookMaNoText = null;

15

System.String (자본 S 포함)은 이미 널 입력 가능하므로 선언 할 필요가 없습니다.

(string? myStr) 잘못되었습니다.


대문자의 중요성을 강조하기 위해 답변을 약간만 수정하십시오. 나는 C #을 처음 사용 하고이 작은 차이를 얻는 데 영원히 걸렸습니다.
B--rian December

4

매우 구체적인 이유로 Type 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>.
Mark Byers

그 흥미 롭군요. 컴파일러에 "하드 코딩"되어 있습니까? 특정 구조체 (Nullable <Nullable <... >>)에서 어떻게 제한됩니까? -편집 이제는 분명히 특별하다는 것을 알았습니다.-컴파일 오류 ... null을 허용하지 않는 값 유형이어야합니다 ....
Joshua Enfield

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. 

여기서 중요한 것은 코드의 의도를 보여주는 것입니다. "의도"가 참조 유형이 널 (null) 일 수있는 경우, 널 (NULL) 값을 널 (null)이 아닌 값으로 지정하면 컴파일러 경고가 발생합니다.

더 많은 정보

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.