# Tuple constructor on 0.6 with convert

**URL:** <https://discourse.julialang.org/t/tuple-constructor-on-0-6-with-convert/2358>\
**Category:** General Usage\
**Created:** [February 28, 2017, 3:33am UTC](https://discourse.julialang.org/t/tuple-constructor-on-0-6-with-convert/2358 "2017-02-28T03:33:04Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![musm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/musm/32/3675_2.png) [@musm](https://discourse.julialang.org/u/musm)\
**Post date:** [February 28, 2017, 3:33am UTC](https://discourse.julialang.org/t/tuple-constructor-on-0-6-with-convert/2358/1 "2017-02-28T03:33:04Z")

</div>

The following works on 0.5 but not on 0.6

```julia
julia> immutable Test1{T<:AbstractFloat} <: Number
                     x::T
                     y::T
        end

julia> import Base.convert; convert{T}(::Type{Tuple{T,T}}, x::Test1{T}) = (x.x, x.y)

julia> Tuple{Float64,Float64}(Test1(.2,2.2))
ERROR: MethodError: Cannot `convert` an object of type Test1{Float64} to an object of type Float64
This may have arisen from a call to the constructor Float64(...),
since type constructors fall back to convert methods.
Stacktrace:
 [1] _totuple at .\tuple.jl:211 [inlined]
 [2] Tuple{Float64,Float64}(::Test1{Float64}) at .\tuple.jl:198

```

Is there a reason why this should fail on 0.6?

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [February 28, 2017, 8:59am UTC](https://discourse.julialang.org/t/tuple-constructor-on-0-6-with-convert/2358/2 "2017-02-28T08:59:46Z")

</div>

Reference:  
[https://github.com/JuliaLang/julia/pull/15516](https://github.com/JuliaLang/julia/pull/15516)

---

<div class="post-metadata">

**Author:** ![musm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/musm/32/3675_2.png) [@musm](https://discourse.julialang.org/u/musm)\
**Post date:** [February 28, 2017, 11:31pm UTC](https://discourse.julialang.org/t/tuple-constructor-on-0-6-with-convert/2358/3 "2017-02-28T23:31:14Z")

</div>

Is that relevant here?

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [February 28, 2017, 11:39pm UTC](https://discourse.julialang.org/t/tuple-constructor-on-0-6-with-convert/2358/4 "2017-02-28T23:39:53Z")

</div>

In Julia 0.6

```julia
Tuple{Float64,Float64}(Test1(.2,2.2))

```

calls

```julia
(::Type{T}){T<:Tuple}(itr) = _totuple(T, itr, start(itr))

```

from `tuple.jl`, that was introduced with that pull request. Instead, in Julia 0.5 the generic

```julia
(::Type{T}){T}(arg) = convert(T, arg)::T

```

from `sysimg.jl` was used (still present in Julia 0.6).

Thus, the change was definitely introduced with that PR, I can’t comment whether it was intentional or not to prevent simple conversions like yours.

---

<div class="post-metadata">

**Author:** ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)\
**Post date:** [March 1, 2017, 12:09am UTC](https://discourse.julialang.org/t/tuple-constructor-on-0-6-with-convert/2358/5 "2017-03-01T00:09:58Z")

</div>

You’re defining a conversion but calling the constructor. Calling convert directly works, or you can define a custom constructor. Or even better, define iteration for your `Test1` object and the default constructor will just work.

```nohighlight
julia> (::Type{Tuple{T,T}}){T}(x::Test1{T}) = (x.x, x.y)

julia> Tuple{Float64,Float64}(Test1(.2,2.2))
(0.2, 2.2)

```
