이것은 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
할 수는 없습니까?
사실, 두 번째 과제에 대한 다음과 같은 코드의 모습을 디 컴파일 :
—
라세 V. 칼슨에게
ValueTuple<object, string> o = new ValueTuple<object, string>(s.Item1, s.Item2);
튜플은 이상하고 기본 CLR 표현에 의존하는 대신 c # 컴파일러 프론트 엔드에서 완전히 구현됩니다. 그 할당 연산자는 당신이 생각하는 것을하지 않습니다.
—
Jeremy Lakeman
public static implicit operator MyValueTuple<A, B>(MyValueTuple<string, string> v) { throw new NotImplementedException(); }
할당을 해체 하는 암시 적 연산자를 추가하십시오 . 또한, 좋은 질문입니다!
@ Çöđěxěŕ 황소 눈! 컴파일 가능하게하고 예외는 예상대로 발생합니다.
—
Mong Zhu
null
A를Nullable<T>
이 구조체 비록.