Этот код работал бы, если бы вы имели неявное преобразование из строки в Employee
. В основном строковый литерал имеет тип string
, то есть его значение является строковой ссылкой (и интернированной). Вы можете назначить значение одного типа переменной другого типа только в том случае, если есть преобразование между двумя типами - пользовательским или встроенным. В этом случае преобразование из string
в Employee
отсутствует ошибка.
В отличие от некоторых других ответов, типы не обязательно должны быть одинаковыми - например, это нормально:
object x = "string literal";
Это нормально, потому что есть неявное преобразование ссылок из string
в object
. Также вы можете написать:
XNamespace ns = "some namespace";
, поскольку существует неявное преобразование из строки в XNamespace
.
Чтобы ответить на ваш второй вопрос: посмотреть, является ли тип в .NET типом значения или ссылочным типом ... struct
и enum
типы являются типами значений; все остальное (класс, делегат, интерфейс, массив) является ссылочным типом. Это исключая типы указателей, которые немного отличаются:)