Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

If an identity conversion exists from S to T, must it be that S and T are same type?

In 6.1.6. of the C# language specification, there is:

The implicit reference conversions are:

(...)
From any reference-type to a reference-type T if it has an implicit identity or reference conversion to a reference-type T0 and T0 has an identity conversion to T.

Why don't they say instead, more simply:

From any reference-type to a reference-type T if it has an implicit identity or reference conversion to T.

Is there any factual difference?

EDIT: I realized I mistyped the specification and the error could potentially be significant for the question (the specification says "The implicit reference conversion are" rather than "An implicit conversion exists")

like image 724
Petr Hudeček Avatar asked Jan 05 '14 15:01

Petr Hudeček


1 Answers

If an identity conversion exists from S to T, must it be that S and T are same type?

The oddity you've discovered in the spec arose as a result of adding dynamic to the language in C# 4.0. At runtime there is no such thing as dynamic; rather, dynamic is just a type that means "I'm really object; please defer analysis of this portion of the program until runtime".

Therefore there is an identity conversion between, say, List<object> and List<dynamic>. From the C# compiler's perspective they are different types because myList[0].Frob() would give an error for the former but not the latter. But from the runtime's perspective they are identical. Therefore the C# language classifies the conversion from one to the other as an identity conversion. At compile time the types can be different for the purposes of the C# language, but from the runtime's perspective they will be identical.

like image 126
Eric Lippert Avatar answered Oct 14 '22 23:10

Eric Lippert