Nullable <int> 대 int? -차이가 있나요?


93

분명히 Nullable<int>int?가치 동일합니다. 하나를 선택해야하는 이유가 있습니까?

Nullable<int> a = null;
int? b = null;
a == b; // this is true

답변:


135

차이 없음.

int?Nullable<int>그 자체가 Nullable<Int32>.

컴파일 된 코드는 사용하기로 선택한 코드와 정확히 동일합니다.


1
불행히도 이것이 엄격하게 사실이 아닌 경우가 있습니다. 이 답변을 참조하십시오 .
qqbenq

22

?형태는 전체 유형의 단지 속기이다. 개인적 선호는 다른 하나를 선택하는 유일한 이유입니다.

여기에 자세한 내용이 있습니다 .

구문은 T?대한 속기 Nullable<T>여기서, Tvalue 타입이다. 두 형식은 서로 바꿔 사용할 수 있습니다.


18

대부분의 경우 동일하다는 데 전적으로 동의하지만 최근 에 둘 사이에 차이 있는 상황을 발견했습니다 . 자세한 내용은 이 질문을 참조 하십시오. 여기에서 간단한 예를 들어 보겠습니다.

void Test<T>(T a, bool b)
{
    var test = a is int? & b;              // does not compile
    var test2 = a is Nullable<int> & b;    // does compile
}

첫 번째 줄은 다음과 같은 오류 메시지를 제공합니다.

error CS1003: Syntax error, ':' expected 
error CS1525: Invalid expression term ';'

정확한 이유가 궁금하다면 이미 연결된 질문 을 확인하는 것이 좋지만 기본 문제는 is(또는 as) 연산자 이후의 구문 분석 단계 에서 ?토큰에 직면했을 때 다음 질문이 있는지 확인하는 것입니다. 토큰 단항 연산자로 해석 &될 수 있습니다 (하나가 될 수 있음). 그렇다면 파서는 ?토큰이 유형 수정자가 될 가능성에 대해 신경 쓰지 않고 그 전에 유형을 사용하고 나머지는 ?token은 삼항 연산자였습니다 (따라서 구문 분석이 실패합니다).

일반적으로 동안 그래서, int?Nullable<int>상호 교환 때문에 그들이 파서가 코드를보고하는 방법으로, 완전히 다른 결과를 생성 할 때, 어떤 코너의 경우가 있습니다.


2
첫 번째 경우 test는 괄호로 고정되므로 var test = (a is int?) & b;. 또한 고정 수 var test = a is int? && b;, 그 주어진 b간단한 값 매개 변수 (평가에 대한 부작용)이 선호 이상한 것입니다 &이상은 &&.
Jeppe Stig Nielsen

특정 구문에서 ?키 문자입니다.
Pete Garafano

나는이 두 가지 형태의 차이를 가져온다대로, 관련 느꼈다 링크 된 질문과 답변을 참조하십시오, 귀하의 의견은 모두,이 : 난 그냥 여기에이 정보를 추가 해결하고, 그냥 문법 설탕 아니라는 것을 증명한다
qqbenq jul.

Jeppe가 맞습니다. nullable int가 아닌 int?삼항 연산 ( var test = a is int? <return if true> : <return if false>) 으로 해석되기 때문에 컴파일 되지 않습니다.
Levi Fuller

1
@LeviFuller (계속) 이러한 특정 bool오버로드에 대한 설명서를 참조하십시오 . 이들은 부울 논리 연산자 합니다 ( &에 대한 bool) 및 부울 조건부 논리 연산자 합니다 ( &&에 대한 bool). 첫 번째 하위 섹션의 이름이 논리적 으로 명확하게 지정되는 방법에 유의하십시오 . C #에서는와 bool숫자 유형 간에 변환 ( "캐스트")이 없습니다 .
Jeppe Stig Nielsen

6

코드 우선 EF (Entity Framework) 생성을 사용할 때 둘 사이에는 분명히 차이가 있습니다.

엔티티에 다음과 같이 선언 된 속성이 포함 된 경우 :

public class MyEntity
{
    public Nullable<int> MyNullableInt { get; set; } 
}

EF는 nullable 속성을 생성하지 않으며 생성기가 다음과 같이 nullable 속성을 만들도록 강제해야합니다.

public class YourContext : DbContext
{
    public DbSet<MyEntity> MyEntities{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<MyEntity>().Property(x => x.MyNullableInt).IsOptional();
    }
}

반면에 다음과 같이 엔티티를 선언하는 경우 :

public class MyEntity
{
     public int? MyNullableInt { get; set; }
}

EF 생성기는 해당 데이터베이스 테이블에 nullable 필드가있는 nullable 속성을 생성합니다.


2
정말 유감입니다.
siride

8
그것은 당신이 Nullable어딘가에 다른 정의 를 가지고 있음을 시사합니다 . 왜냐하면 내장 된 Nullable<T>EF는 둘 사이의 차이를 볼 수 없기 때문입니다 . EF 사람들이 그들을 다르게 대하고 싶었다하더라도 그들은 할 수 없었습니다.

1
누군가 이것이 사실임을 확인 했습니까? (반대표 때문에 조금 조심)
RayLoveless

@RayL 아니요 이것은 사실이 아닙니다. 이 대답은 정확하지 않으며 hvd가 지적했듯이 불가능합니다.
신발

1
EF 코드는 코드 템플릿을 사용하여 생성된다는 점을 고려하면 실제로 가능할 수 있습니다. 내 대답은 내 경험과 내가 제안한 변경 사항을 기반으로 문제를 해결했습니다. 또한 일부 사람들은 실제로 up-votes를 기반으로 한 경우라고 생각한 것 같습니다.
Maciej

2

Nullable 은 제네릭 유형이지만 int? 아니다.

int 보다 Nullable을 사용해야 하는 몇 가지 시나리오가 있습니까?

예를 들어 : 여기서 Nullableint로 바꿀 수 없습니까?

Nullable 을 사용하지 않고 아래 코드를 어떻게 변경할 수 있습니까?

class LazyValue<T> where T : struct
{
   private Nullable<T> val;
   private Func<T> getValue;

   // Constructor.
   public LazyValue(Func<T> func)
   {
      val = null;
      getValue = func;
   }

   public T Value
   {
      get
      {
         if (val == null)
            // Execute the delegate.
            val = getValue();
         return (T)val;
      }
   }
}

3
문제는 일반적인 유형에 대해 질문했지만, 문제는 INT를 지정한 경우는 없습니다 그래서 어느 것이, 문제가 있습니다 Nullable<T>그것의Nullable<int>
앤드류
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.