import kotlin.reflect.KProperty // Definitions class M operator fun M.getValue(thisRef: Any?, property: KProperty<*>): String = "value" operator fun M.setValue(thisRef: Any?, property: KProperty<*>, value: Z) {} fun m(): M = M() // We don't allow to infer type of a delegate expression through a setValue, where the argument (value) is constrained by the return type of a getValue var a by m() // We infer type of delegate expression through a setValue from the explicit property type var b: String by m() fun takeString(v: String) {} fun main() { takeString(a) a = "a" takeString(b) b = "b" }