当我尝试在可枚举对象上使用?。first()时,它会抛出错误"序列不包含任何元素"当对象不包含任何项目时。
我认识到解决方案是使用.FirstOrDefault(),但我不明白为什么我原来的努力不起作用。我误解了某些东西,还是仅仅是其中的一个'?
答案 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 ,因此会引发异常。