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")
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 asdynamic
; rather,dynamic
is just a type that means "I'm reallyobject
; please defer analysis of this portion of the program until runtime".Therefore there is an identity conversion between, say,
List<object>
andList<dynamic>
. From the C# compiler's perspective they are different types becausemyList[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.