在检查是否有摄像头并在Windows移动设备上启用了摄像头时,遇到了我不了解的问题。

代码如下:

    public static bool CameraP(){

        return Microsoft.WindowsMobile.Status.SystemState.CameraPresent;
    }

    public static bool CameraE()
    {
        return Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
    }

    public static bool CameraPresent1()
    {
        return Microsoft.WindowsMobile.Status.SystemState.CameraPresent
              && Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
    }

    public static bool CameraPresent2()
    {
        return CameraP() && CameraE();
    }

当我调用CameraPresent2()时,它返回false(没有摄像头)。但是,当我调用CameraPresent1()时,我收到一条MissingMethodException并带有注释“找不到方法:get_CameraEnabled Microsoft.WindowsMo​​bile.Status.SystemState”。

仅因为它们都是属性(在语言级别上),才在CameraPresent1中评估第二个术语吗?

还有什么可以解释行为差异的吗?

最佳答案

第二项不评估。

不评估第一项。
CameraPresent1()方法甚至没有开始执行。

首次调用CameraPresent1()时,运行时必须将MSIL JIT编译为本地代码。这要求解决所有方法调用,甚至可能只有有条件才能达到的方法调用。使用MissingMethodException编译失败。

使用CameraPresent2()时,仅在首次调用CameraEnabled时才编译对CameraE()的getter的调用,这永远不会发生。

关于c# - 为什么短路不能阻止与逻辑AND(&&)的不可达分支相关的MissingMethodException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5233155/

10-12 04:58