분명히 Nullable<int>및 int?가치 동일합니다. 하나를 선택해야하는 이유가 있습니까?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
답변:
대부분의 경우 동일하다는 데 전적으로 동의하지만 최근 에 둘 사이에 차이 가 있는 상황을 발견했습니다 . 자세한 내용은 이 질문을 참조 하십시오. 여기에서 간단한 예를 들어 보겠습니다.
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>상호 교환 때문에 그들이 파서가 코드를보고하는 방법으로, 완전히 다른 결과를 생성 할 때, 어떤 코너의 경우가 있습니다.
test는 괄호로 고정되므로 var test = (a is int?) & b;. 또한 고정 수 var test = a is int? && b;, 그 주어진 b간단한 값 매개 변수 (평가에 대한 부작용)이 선호 이상한 것입니다 &이상은 &&.
?키 문자입니다.
int?삼항 연산 ( var test = a is int? <return if true> : <return if false>) 으로 해석되기 때문에 컴파일 되지 않습니다.
bool오버로드에 대한 설명서를 참조하십시오 . 이들은 부울 논리 연산자 합니다 ( &에 대한 bool) 및 부울 조건부 논리 연산자 합니다 ( &&에 대한 bool). 첫 번째 하위 섹션의 이름이 논리적 으로 명확하게 지정되는 방법에 유의하십시오 . C #에서는와 bool숫자 유형 간에 변환 ( "캐스트")이 없습니다 .
코드 우선 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어딘가에 다른 정의 를 가지고 있음을 시사합니다 . 왜냐하면 내장 된 Nullable<T>EF는 둘 사이의 차이를 볼 수 없기 때문입니다 . EF 사람들이 그들을 다르게 대하고 싶었다하더라도 그들은 할 수 없었습니다.
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;
}
}
}
Nullable<T>그것의Nullable<int>