Почему строка является ссылочным типом, но ведет себя иначе, чем другие ссылочные типы? - PullRequest
4 голосов
/ 16 марта 2010

Мы знаем, что строка является ссылочным типом, поэтому мы имеем

string s="God is great!";

но на той же ноте, если я объявлю класс, скажем Employee, который является ссылочным типом, так почему не работает следующий фрагмент кода?

Employee e = "Saurabh";

2- Как мы на самом деле определяем, является ли тип ссылочным типом или типом значения?

Ответы [ 5 ]

14 голосов
/ 16 марта 2010

Этот код работал бы, если бы вы имели неявное преобразование из строки в Employee. В основном строковый литерал имеет тип string, то есть его значение является строковой ссылкой (и интернированной). Вы можете назначить значение одного типа переменной другого типа только в том случае, если есть преобразование между двумя типами - пользовательским или встроенным. В этом случае преобразование из string в Employee отсутствует ошибка.

В отличие от некоторых других ответов, типы не обязательно должны быть одинаковыми - например, это нормально:

object x = "string literal";

Это нормально, потому что есть неявное преобразование ссылок из string в object. Также вы можете написать:

XNamespace ns = "some namespace";

, поскольку существует неявное преобразование из строки в XNamespace.

Чтобы ответить на ваш второй вопрос: посмотреть, является ли тип в .NET типом значения или ссылочным типом ... struct и enum типы являются типами значений; все остальное (класс, делегат, интерфейс, массив) является ссылочным типом. Это исключая типы указателей, которые немного отличаются:)

4 голосов
/ 16 марта 2010

Поскольку они не одного типа, если вы определите TypeConverter, это сработает.

http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx

2 голосов
/ 16 марта 2010
object x;

x = new Employee();

x = "Hello World!";
2 голосов
/ 16 марта 2010
Employee e = "Saurabh";

не будет работать просто потому, что они разных типов.

2 голосов
/ 16 марта 2010

Эталонные типы нельзя назначать, если они не относятся к одному и тому же типу (это называется безопасностью типов). Первый пример работает, потому что вы присваиваете строковый литерал переменной типа System.String. Второй пример не работает, потому что вы присваиваете строковый литерал переменной типа Employee. Типы должны совпадать или быть назначаемыми справа налево, чтобы присвоение значения работало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...