[c#] ValueTuple 공 변형은 무엇입니까?

이것은 C # 7.3 (프레임 워크 4.8)에서 올바르게 컴파일됩니다.

(string, string) s = ("a", "b");
(object, string) o = s;

나는 이것이 다음에 대한 구문 설탕이며 올바르게 컴파일된다는 것을 알고 있습니다.

ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;

그래서, ValueTuples가 할당 될 수 있다는 것을 나타납니다 covariantly , 굉장하다 !

불행히도, 나는 왜 그런지 이해하지 못한다 . 나는 C #이 인터페이스와 델리게이트에 대한 공분산만을 지원 한다는 인상을 받았다 . ValueType둘 다 아닙니다.

사실,이 기능을 내 코드로 복제하려고하면 실패합니다.

struct MyValueTuple<A, B>
{
    public A Item1;
    public B Item2;

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

...

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

그렇다면 왜 ValueTuples를 공변량으로 할당 MyValueTuple할 수는 없습니까?



답변

실제로 여기서 일어나고있는 일은 파괴적인 임무라고 생각합니다. 튜플 할당은 암시 적 구성 요소를 변환하려고합니다, 할당 할 수 있습니다로 string하는 object, 즉 여기서 발생하는 것입니다.

이 언어는 동일한 수의 요소를 갖는 튜플 유형 간의 할당을 지원하며, 각 오른쪽 요소를 해당 왼쪽 요소로 암시 적으로 변환 할 수 있습니다. 다른 전환은 할당에 고려되지 않습니다.

출처

sharplab.io에서 참조하십시오


답변