분명히 Nullable<int>
및 int?
가치 동일합니다. 하나를 선택해야하는 이유가 있습니까?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
답변
차이 없음.
int?
은 Nullable<int>
그 자체가 Nullable<Int32>
.
컴파일 된 코드는 사용하기로 선택한 코드와 정확히 동일합니다.
답변
답변
대부분의 경우 동일하다는 데 전적으로 동의하지만 최근 에 둘 사이에 차이 가 있는 상황을 발견했습니다 . 자세한 내용은 이 질문을 참조 하십시오. 여기에서 간단한 예를 들어 보겠습니다.
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을 사용해야 하는 몇 가지 시나리오가 있습니까?
예를 들어 : 여기서 Nullable 을 int로 바꿀 수 없습니까?
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;
}
}
}