为什么以下C#代码在可为空的DateTime初始化时引发NullReferenceException?

米卡尔·科斯基宁(Mikael Koskinen)

这是一些简单的代码:

    static void Main(string[] args)
    {
        var coll = new List<string> {"test", "test2", "test3"};

        var filteredColl = coll.Select(x => x).ToList();

        if (!filteredColl.Any())
        {
            DateTime? date = new DateTime();

            filteredColl = coll.Where(x => date.GetValueOrDefault().Date.ToString(CultureInfo.InvariantCulture) == x).Select(x => x).ToList();
        }
    }

问题是,为什么以下步骤使它与NullReferenceException崩溃

1)if的断点

断点

2)设置下一个执行点:

执行点

3)尝试继续执行F10:

例外

如果我注释掉代码的最后一行,它不会崩溃。

更新:这是堆栈跟踪:

System.NullReferenceException was unhandled   HResult=-2147467261  
Message=Object reference not set to an instance of an object.  
Source=ConsoleApplication28   StackTrace:
       at ConsoleApplication28.Program.Main(String[] args) in Program.cs: line 21
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()   InnerException:
马克·格雷维尔(Marc Gravell)

这是将执行点移到声明已捕获变量作用域的上下文中的副作用。将其报告为IDE错误是合理的,但修复起来并不容易。基本上,date它不是变量-由于存在lambda,因此它是捕获上下文中的一个字段编译器本质上会:

if (!filteredColl.Any())
{
    var ctx = new SomeCaptureContext(); // <== invented by the compiler
    ctx.date = new DateTime();

    filteredColl = coll.Where(ctx.SomePredicate).Select(x => x).ToList();
}

在哪里SomePredicate

class SomeCaptureContext {
    public DateTime? date; // yes, a public field - needs to support 'ref' etc
    public bool SomePredicate(string x) // the actual name is horrible
    {
        return this.date.GetValueOrDefault()
              .Date.ToString(CultureInfo.InvariantCulture) == x;
    }
}

这里的问题是,当您将执行位置拖动到以下位置时:

DateTime? date = new DateTime();

实际上(按IL术语)将其拖到行中:

ctx.date = new DateTime();

紧接其前的捕获上下文行,即

var ctx = new SomeCaptureContext();

从来没有执行过,所以ctx没有执行null因此NullReferenceException

将其记录为错误是合理的,但它是一个微妙的错误-并且您不一定总是希望拖动执行上下文来初始化捕获上下文-它必须是“如果它们是null”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么集合初始化引发NullReferenceException

来自分类Dev

为什么集合初始化引发NullReferenceException

来自分类Dev

为什么使用数组初始化程序的C#代码无法重构我的期望

来自分类Dev

为什么此嵌套对象初始化程序引发空引用异常?

来自分类Dev

为什么初始化时不使用setter方法?

来自分类Dev

为什么Hibernate在初始化时在子句中执行sql

来自分类Dev

为什么在初始化时使用子类的实现?

来自分类Dev

React 初始化时未定义道具。为什么?

来自分类Dev

为什么以下代码取决于我初始化变量的时间?

来自分类Dev

为什么以下代码取决于我初始化变量的时间?

来自分类Dev

当parens初始化时,构造函数初始化列表中的C ++ 11大括号初始化为什么不起作用?

来自分类Dev

在 C 中,变量的多次初始化不会引发错误。为什么?

来自分类Dev

为什么以下成员初始化器在c ++中不起作用

来自分类Dev

DateTime初始化时发生异常

来自分类Dev

初始化时如何使jstree为空?

来自分类Dev

为什么我必须在C ++中的std :: array <SomeStruct,size>初始化时为每个项目指定类型

来自分类Dev

如何在C#中解析可为空的DateTime对象

来自分类Dev

为什么以下代码不会引发错误?

来自分类Dev

Yapsy在初始化时引发TypeError,在初始化时缺少参数

来自分类Dev

在初始化时关闭表单会引发错误

来自分类Dev

在初始化时关闭表单会引发错误

来自分类Dev

为什么这个 C 结构体初始化代码会产生总线错误?

来自分类Dev

为什么属性未初始化时TS的编译方式不同

来自分类Dev

当初始化时超过ng-maxlength时,为什么angularjs会清空输入字段?

来自分类Dev

为什么使用默认对象初始化时我的哈希未填充

来自分类Dev

为什么在字典初始化时不发生内存溢出?

来自分类Dev

为什么在初始化时需要指定extern / static变量的类型?

来自分类Dev

为什么itertools.product在初始化时会贯穿所有元素?

来自分类Dev

为什么我的主管在使用badarg进行初始化时失败?

Related 相关文章

  1. 1

    为什么集合初始化引发NullReferenceException

  2. 2

    为什么集合初始化引发NullReferenceException

  3. 3

    为什么使用数组初始化程序的C#代码无法重构我的期望

  4. 4

    为什么此嵌套对象初始化程序引发空引用异常?

  5. 5

    为什么初始化时不使用setter方法?

  6. 6

    为什么Hibernate在初始化时在子句中执行sql

  7. 7

    为什么在初始化时使用子类的实现?

  8. 8

    React 初始化时未定义道具。为什么?

  9. 9

    为什么以下代码取决于我初始化变量的时间?

  10. 10

    为什么以下代码取决于我初始化变量的时间?

  11. 11

    当parens初始化时,构造函数初始化列表中的C ++ 11大括号初始化为什么不起作用?

  12. 12

    在 C 中,变量的多次初始化不会引发错误。为什么?

  13. 13

    为什么以下成员初始化器在c ++中不起作用

  14. 14

    DateTime初始化时发生异常

  15. 15

    初始化时如何使jstree为空?

  16. 16

    为什么我必须在C ++中的std :: array <SomeStruct,size>初始化时为每个项目指定类型

  17. 17

    如何在C#中解析可为空的DateTime对象

  18. 18

    为什么以下代码不会引发错误?

  19. 19

    Yapsy在初始化时引发TypeError,在初始化时缺少参数

  20. 20

    在初始化时关闭表单会引发错误

  21. 21

    在初始化时关闭表单会引发错误

  22. 22

    为什么这个 C 结构体初始化代码会产生总线错误?

  23. 23

    为什么属性未初始化时TS的编译方式不同

  24. 24

    当初始化时超过ng-maxlength时,为什么angularjs会清空输入字段?

  25. 25

    为什么使用默认对象初始化时我的哈希未填充

  26. 26

    为什么在字典初始化时不发生内存溢出?

  27. 27

    为什么在初始化时需要指定extern / static变量的类型?

  28. 28

    为什么itertools.product在初始化时会贯穿所有元素?

  29. 29

    为什么我的主管在使用badarg进行初始化时失败?

热门标签

归档