任何人都可以了解为什么这个单元测试在Visual Studio 2013中失败了?
[TestMethod]
public void Inconceivable()
{
int? x = 0;
Assert.AreEqual(typeof(int?), x.GetType());
}
Run Code Online (Sandbox Code Playgroud)
Jaa*_*rus 27
您的测试失败,因为:
在Nullable类型上调用GetType会导致在将类型隐式转换为Object时执行装箱操作.因此,GetType始终返回表示基础类型的Type对象,而不是Nullable类型.
您可以从如何:识别可空类型中了解更多信息.
从前一篇文章中摘取的一些例子:
int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"
Run Code Online (Sandbox Code Playgroud)
另请注意:
C#的是操作者也可为空的基本类型进行操作.因此,您无法使用is来确定变量是否为Nullable类型.以下示例显示is运算符将Nullable <int>变量视为int.
int? i = 5;
if (i is int) { ... } // true
Run Code Online (Sandbox Code Playgroud)
假设C#编译器正在优化可空类型,你是正确的.以下是Jon Skeet的深度C#的引用,它应该回答你的问题:
只有在装箱和拆箱方面,CLR才有关于可空类型的任何特殊行为.实际上,这种行为只是在.NET 2.0发布之前不久发生了变化,这是社区请求的结果.
Nullable的实例被装箱为空引用(如果它没有值)或盒装值T(如果有).它永远不会装入"盒装可空的int" - 没有这种类型.
StackOverflow上有一个类似的线程:Nullable类型不是可以为空的类型?
| 归档时间: |
|
| 查看次数: |
552 次 |
| 最近记录: |