int之间的区别? i = null和int? i = 0x0

时间:2015-07-14 18:32:59

标签: c# null

我正在编写单元测试来测试我的方法是否可以使用null作为各种属性和参数。对于其中一个测试,我想使用null 0x0的十六进制值作为null来查看int参数是否被捕获或null被捕获。

    [Fact]
    public void GetFoo_throws_exception_when_foo_has_null_id()
    {
        int? nullFooId = 0x0; // would this be defined as int or null?

        Foo foo = new Foo
        {
            FooId = nullFooId.Value
        };

        Action action = () => _sut.GetFoo(nullFooId.Value);
        action.ShouldThrow<KeyNotFoundException>();
    } 

我想知道nullFooIdnull还是int以及原因。同样,如果我明确地放置_sut.GetFoo(0x0),是否要查找nullint表示是否由编译器决定?它是否试图找到适当的位数?

2 个答案:

答案 0 :(得分:0)

nullFooId将是0,而不是null。如果您希望它为null,只需将其设置为null

没有任何关于&#34;找到适当数量的比特&#34;。如果任何位(即它是一个数字),则nullFooId将为非空。

答案 1 :(得分:0)

根据C# grammar0x0int类型的整数字面值,其值为十进制数。

鉴于表达式0x0 == null的评估结果为false,您认为int? x = 0x0;会将哪个值分配给x

此外,你说

  

我想知道nullFooIdnull还是int以及原因。

表明存在根本性的误解。您的nullFooId类型为Nullable<int>struct有两个属性,类似于以下内容。请注意,编译器魔术是在幕后发生的,因为对此的支持已融入语言本身:

public struct Nullable<T> where T : struct
{
  private bool hasValue ;
  internal T   value ;

  public bool HasValue { get { return this.hasValue ; } }

  public T Value
  {
    get
    {
      if (!this.hasValue) ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
      return this.value;
    }
  }

}