我在http://mings.in/2017/03/12/Kotlin-Null-Safety.html读过猫王操作员
代码A和代码C都没问题,但是代码B是错误的(“类型不匹配:推断类型是Int但单位是预期的”),为什么?
Code A
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val b: String? = "hello"
val l = b?.length ?: -1
}
Code B
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val b: String? = "hello"
val l = b?.length ?: return -1
}
Code C
fun getLength(b: String?): Int {
val l = b?.length ?: return -1
return l
}
BTW,BakaWaii告诉我“代码A没问题,因为-1是表示值的表达式,因此它可以分配给l . 但是在代码B中,返回-1是从函数返回的表达式 . ”
我无法理解“在代码B中,返回-1是一个从函数返回的表达式” . 我认为“返回-1”将返回-1,为什么应用程序出现“类型不匹配:推断类型是Int但单位是预期的”?
And more:
代码C就像代码B一样,我不知道为什么它可以!
2 回答
Code A
和Code B
之间的区别是第一个将-1
设置为您的变量(现在它是l
),第二个设置-1
作为函数工作的结果 . 并且Type mismatch
错误消息表示该函数不应返回任何值(或返回Unit
),但您尝试返回int - 因此它不是Elvis运算符语法错误 .然后,如果您将
Code B
放在某个Int
函数中(就像在Code C
中那样),就不会有任何错误 .Example
如果你想"convert"
Int
到StringBuilder
你可以这样做:猜猜没有问题 .
第二个例子也是绝对正确的 .
如果参数值为
null
,则函数将不会到达第二行,因为它将首先返回 .第三个例子会产生错误(比如你的
Code B
) .同样,语法中没有错误 . 猫王的经营者是对的 . 错误是因为您尝试将
String
返回到声明为返回StringBuilder
的函数 .来自Kotlin's doc:
和also,
所以,答案是肯定的,只要封闭函数的返回类型与返回值匹配,例如:
请注意,代码A和代码B在控制流程中是不同的 . 如果您在左侧值为null时尝试分配备用/默认值,则代码A将是最佳方法 .