删除无法访问的代码总是安全吗?

kon*_*ski 5 c#

假设我有一个工具可以自动删除编译器检测到的无法访问的C#代码.是否存在这样的操作会让我陷入困境的情况?请分享有趣的案例.

kon*_*ski 13

这是一个有趣的例子.考虑这样的函数:

    public static IEnumerable<int> Fun()
    {
        if (false)
        {
            yield return 0;
        }            
    }
Run Code Online (Sandbox Code Playgroud)

线路yield被检测为无法到达.但是,删除它将使程序无法编译.yield函数中包含的函数提供了编译器信息来重新组织函数,以便不执行任何操作只返回空集合.随着yield行中删除,而它的需要,它看起来就像没有返回普通函数.

正如在评论中一样,这个例子是设计的,但是false我们不能从其他生成的项目中获得一个常量值(即这样的代码片段看起来不像在这种情况下那么明显).

编辑:请注意,yield构造实际上非常相似async/await.然而,后者的语言创造者采用了一种不同的(IMO更好)方法来阻止这种情况.可以以相同的方式定义迭代器块(在函数签名中使用一些关键字而不是从函数体中检测它).