显然,Nullable<int>和int?在数值上相等.有没有理由选择其中一个?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
Run Code Online (Sandbox Code Playgroud)
Luk*_*keH 125
没有不同.
int?只是简写Nullable<int>,本身就是速记Nullable<Int32>.
无论您选择使用哪种编译代码都将完全相同.
qqb*_*enq 17
虽然我完全同意,在大多数情况下,他们都是一样的,我最近碰到一个情况,当是这两个之间的差异.对于血淋淋的细节,请看这个问题,但是在这里给你一个简单的例子:
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
}
Run Code Online (Sandbox Code Playgroud)
第一行给出以下错误消息:
error CS1003: Syntax error, ':' expected
error CS1525: Invalid expression term ';'
Run Code Online (Sandbox Code Playgroud)
如果您对此确切原因感到好奇,我建议您检查已经链接的问题,但基本问题是在is(或as)运算符之后的解析阶段,当我们面对?令牌时,我们检查下一个 token 可以被解释为一元运算符(&可以是一个),如果是这样的话:解析器不关心?令牌是类型修饰符的可能性,它只是使用它之前的类型,并将解析其余的操作符,就好像?token是一个三元运算符(因此解析将失败).
因此,虽然通常int?并且Nullable<int>可以互换,但是由于解析器看到代码的方式,它们会产生完全不同的结果.
当使用代码优先实体框架(EF)生成时,两者之间显然存在差异:
当您的实体包含声明为的属性时:
public class MyEntity
{
public Nullable<int> MyNullableInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
EF不会生成可空属性,您必须强制生成器使其可以为空:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您声明您的实体如下:
public class MyEntity
{
public int? MyNullableInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
EF生成器将在相应的数据库表中生成具有可空字段的可空属性.