이것은 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>'
그렇다면 왜 ValueTuple
s를 공변량으로 할당 MyValueTuple
할 수는 없습니까?
답변
실제로 여기서 일어나고있는 일은 파괴적인 임무라고 생각합니다. 튜플 할당은 암시 적 구성 요소를 변환하려고합니다, 할당 할 수 있습니다로 string
하는 object
, 즉 여기서 발생하는 것입니다.
이 언어는 동일한 수의 요소를 갖는 튜플 유형 간의 할당을 지원하며, 각 오른쪽 요소를 해당 왼쪽 요소로 암시 적으로 변환 할 수 있습니다. 다른 전환은 할당에 고려되지 않습니다.