我正在编写单元测试来测试我的方法是否可以使用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>();
}
我想知道nullFooId
是null
还是int
以及原因。同样,如果我明确地放置_sut.GetFoo(0x0)
,是否要查找null
或int
表示是否由编译器决定?它是否试图找到适当的位数?
答案 0 :(得分:0)
nullFooId
将是0
,而不是null
。如果您希望它为null,只需将其设置为null
。
没有任何关于&#34;找到适当数量的比特&#34;。如果任何位(即它是一个数字),则nullFooId
将为非空。
答案 1 :(得分:0)
根据C# grammar,0x0
是int
类型的整数字面值,其值为十进制数。
鉴于表达式0x0 == null
的评估结果为false
,您认为int? x = 0x0;
会将哪个值分配给x
?
此外,你说
我想知道
nullFooId
是null
还是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;
}
}
}