Nullable <int>与int? - 有什么区别吗?

Zac*_*ott 85 .net c#

显然,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>.

无论您选择使用哪种编译代码都将完全相同.

  • 不幸的是,有些极端情况并非严格如此。请参阅此 [答案](http://stackoverflow.com/a/24738380/1552016)。 (2认同)

Ste*_*end 21

?形式仅仅是丰满型的简写.个人偏好是选择一个而不是另一个的唯一原因.

详情请点击此处.

语法T?是简写 Nullable<T>,其中T是值类型.这两种形式是可以互换的.


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>可以互换,但是由于解析器看到代码的方式,它们会产生完全不同的结果.

  • 第一种情况,`test`,用括号固定,所以`var test = (a is int?) &amp; b;`。也可以用`var test = a is int 修复?&amp;&amp; b;`,并且鉴于 `b` 是一个简单的值参数(对评估没有副作用),相比于 `&amp;&amp;`,更喜欢 `&amp;` 似乎很奇怪。 (2认同)

Mac*_*iej 6

当使用代码优先实体框架(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生成器将在相应的数据库表中生成具有可空字段的可空属性.

  • 这表明你在某处有一些其他的'Nullable`定义,因为有了内置的`Nullable <T>`,EF不可能看到两者之间的区别.即使EF人们想要以不同方式对待他们,他们也不能. (8认同)
  • 那真是太不幸了. (2认同)