What makes ValueTuple covariant? : <p>This compiles correctly in C# 7.3 (Framework 4.8):</p>

<pre><code>(string, string) s = ("a", "b");
(object, string) o = s;
</code></pre>

<p>I know that this is syntactic sugar for the following, which also compiles correctly:</p>

<pre><code>ValueTuple&lt;string, string&gt; s = new ValueTuple&lt;string, string&gt;("a", "b");
ValueTuple&lt;object, string&gt; o = s;
</code></pre>

<p>So, it appears that ValueTuples can be assigned <a href="https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)" rel="noreferrer">covariantly</a>, <em>which is awesome</em>!</p>

<p>Unfortunately, I don't understand <em>why</em>: I was under the impression that C# <a href="https://stackoverflow.com/a/19094386/87698">only supported covariance on interfaces and delegates</a>. <code>ValueType</code> is neither.</p>

<p>In fact, when I try to duplicate this feature with my own code, I fail:</p>

<pre><code>struct MyValueTuple&lt;A, B&gt;
{
    public A Item1;
    public B Item2;

    public MyValueTuple(A item1, B item2)
    {
        Item1 = item1;
        Item2 = item2;
    }
}

...

MyValueTuple&lt;string, string&gt; s = new MyValueTuple&lt;string, string&gt;("a", "b");
MyValueTuple&lt;object, string&gt; o = s;
// ^ Cannot implicitly convert type 'MyValueTuple&lt;string, string&gt;' to 'MyValueTuple&lt;object, string&gt;'
</code></pre>

<p>So, why can <code>ValueTuple</code>s be assigned covariantly, but <code>MyValueTuple</code>s can't?</p>
