[c#] Nullable <int> 대 int? -차이가 있나요?

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

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



답변

차이 없음.

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

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


답변

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

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

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


답변

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

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>상호 교환 때문에 그들이 파서가 코드를보고하는 방법으로, 완전히 다른 결과를 생성 할 때, 어떤 코너의 경우가 있습니다.


답변

코드 우선 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 속성을 생성합니다.


답변

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;
      }
   }
}


답변