为什么没有IEnumerable?第一个()工作?

时间:2016-12-20 17:13:32

标签: c# visual-studio null-conditional-operator

当我尝试在可枚举对象上使用?。first()时,它会抛出错误"序列不包含任何元素"当对象不包含任何项目时。

我认识到解决方案是使用.FirstOrDefault(),但我不明白为什么我原来的努力不起作用。我误解了某些东西,还是仅仅是其中的一个'?

5 个答案:

答案 0 :(得分:9)

空序列不是null,它是一个实际的对象,其中没有任何项目。如果表达式为?. ,则null不会调用有问题的成员,而不是First,因此调用First,并{{1}}抛出传递空序列时的异常。

答案 1 :(得分:5)

空条件运算符(?)在执行成员访问操作之前测试null。空序列不为空,它只包含没有元素。所以当你调用First()时它会失败,因为没有第一个元素。

答案 2 :(得分:4)

因为空集合不是null

答案 3 :(得分:3)

当序列不包含元素时,First()显式抛出异常。如果没有元素,则FirstOrDefault()给出null(编辑:或者更确切地说,它给出了一个默认值,对于引用类型是null)。你希望First()从空序列中返回什么?

答案 4 :(得分:3)

根据MSDN文档:

            let image = UIImage(data: data!)
            let oldWidth = image!.size.width
            let scaleFactor = UIWindow().screen.bounds.width / oldWidth
            let cgImage = image!.CGImage

            let width = Double(CGImageGetWidth(cgImage)) * Double(scaleFactor)
            let height = Double(CGImageGetHeight(cgImage)) * Double(scaleFactor)
            let bitsPerComponent = CGImageGetBitsPerComponent(cgImage)
            let bytesPerRow = CGImageGetBytesPerRow(cgImage)
            let colorSpace = CGImageGetColorSpace(cgImage)
            let bitmapInfo = CGImageGetBitmapInfo(cgImage)

            let context = CGBitmapContextCreate(nil, Int(width), Int(height), bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo.rawValue)

            CGContextSetInterpolationQuality(context, .High)

            CGContextDrawImage(context, CGRect(origin: CGPointZero, size: CGSize(width: CGFloat(width), height: CGFloat(height))), cgImage)

            let scaledImage = CGBitmapContextCreateImage(context).flatMap { return UIImage(CGImage: $0) }
            imageView.image = scaledImage

因此,如果您的集合不为null,则运行时将尝试返回第一个元素。由于集合为空并且您未使用 FirstOrDefault ,因此会引发异常。

链接:https://msdn.microsoft.com/en-us/library/dn986595.aspx