代码之家  ›  专栏  ›  技术社区  ›  Neo Cortex

十进制的?与asp.net mvc中的可空<decimal>相比[重复]

  •  0
  • Neo Cortex  · 技术社区  · 7 年前

    显然 Nullable<int> int? 价值相等。有什么理由选择一个而不是另一个?

    Nullable<int> a = null;
    int? b = null;
    a == b; // this is true
    
    0 回复  |  直到 11 年前
        1
  •  128
  •   LukeH    15 年前

    没有区别。

    int? 只是速记 Nullable<int> ,它本身就是 Nullable<Int32>

    编译后的代码将与您选择使用的代码完全相同。

        2
  •  21
  •   Steve Townsend    15 年前

    这个 ? 表格只是全字的速记。个人偏好是选择其中一个的唯一原因。

    here .

    T? Nullable<T> ,其中 T 这两种形式是可以互换的。

        3
  •  17
  •   Community Mohan Dere    9 年前

    两者之间的区别。 this question ,但在这里给您举一个简单的例子:

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

    如果你对这件事的确切原因感到好奇,我真的建议你检查一下 linked question ,但基本问题是在解析阶段 is (或 as )接线员,当我们面对 ? 我们检查一下 下一个 代币 被解释为一元运算符( & 如果是的话:解析器不关心 令牌是一个类型修饰符,它只使用前面的类型,并将解析其余的类型,就像 ? 令牌是三元运算符(因此解析将失败)。

    int? Nullable<int> 是可以互换的,当它们产生完全不同的结果时,会出现一些角点情况,这是因为解析器如何看到您的代码。

        4
  •  6
  •   Wai Ha Lee captain-yossarian from Ukraine    11 年前

    在使用代码优先实体框架(EF)生成时,两者之间显然存在差异:

    当您的实体包含声明如下的属性时:

    public class MyEntity
    {
        public Nullable<int> MyNullableInt { get; set; } 
    }
    

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

    public class MyEntity
    {
         public int? MyNullableInt { get; set; }
    }
    

    EF生成器将属性生成一个可为空的属性,该属性在相应的数据库表中具有一个可为空的字段。

        5
  •  1
  •   Rajes    10 年前

    可为空 是泛型类型,但是 内景? 不是。

    可为空 内景?

    在这里你不能代替 可为空 具有

    如何在不使用 可为空

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