C # 널 입력 가능 문자열 오류


136
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

나중에 코드에서 다음과 같이 사용합니다.

typeOfContract = Request.QueryString["type"];

typeOfContract줄을 선언 할 때 다음과 같은 오류가 발생합니다 .

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

어떤 아이디어? 기본적으로, 나는 행동을 수행하기 전에 그것이 "type"존재 하는지 확인하고 싶습니다 QueryString.

답변:


304

System.String은 참조 유형이며 이미 "널링 가능"합니다.

Nullable <T> 및? 접미사는 Int32, Double, DateTime 등과 같은 값 유형에 사용됩니다.


13
주목할 사항 : Nullable <T>는 값 유형 자체이지만 "struct"제네릭 형식 제약 조건에는 nullable이 아닌 값 형식 만 포함되므로 Nullable <Nullable <int >>을 수행 할 수 없습니다.
Jon Skeet

C # 8.0에서 참조 유형은 널 입력 가능으로 표시 될 수 있습니다. string?이 문자열이 null 일 수 있음을 세상에 알리기 위해 입력 할 수 있습니다. Ref : youtube.com/watch?v=VdC0aoa7ung
nkalfov

39

당신은 그것을 복잡하게 만들고 있습니다. string이미 nullable입니다. 널 입력 할 필요는 없습니다 . ?속성 유형을 가져옵니다 .


19

string은 값 유형이 아니므로 string은 널 입력 가능 매개 변수가 될 수 없습니다. 문자열은 참조 유형입니다.

string s = null; 

매우 유효한 명령문이므로 널 입력 가능하게 할 필요가 없습니다.

private string typeOfContract
    {
      get { return ViewState["typeOfContract"] as string; }
      set { ViewState["typeOfContract"] = value; }
    }

as 키워드 때문에 작동해야 합니다.


13

문자열은 참조 유형이므로 Nullable<T>여기서 사용할 필요가 없으며 사용할 수 없습니다 . typeOfContract를 문자열로 선언하고 쿼리 문자열에서 null을 가져온 후 null을 확인하십시오. 또는 null과 같은 빈 문자열 값을 처리하려면 String.IsNullOrEmpty를 사용하십시오.


4

널 입력 가능 ?의 경우 문자열을 제외한 모든 C # 프리미티브 와 함께 사용 하십시오 .

다음 페이지는 C # 프리미티브 목록을 제공합니다 . http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx


1
링크가 깨졌습니다. 감사합니다
Mina Gabriel

감사합니다 Mina, 다른 링크를 발견하고 참조를 업데이트했습니다.
제임스 오라 벡

1
프리미티브뿐만 아니라 null이 아닌 모든 값 유형 (.NET에서 특별히 처리하지 않은)이 작동합니다.
IllidanS4가 Monica를

0

다가오는 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.