Pourquoi chaîne est un type de référence, mais se comporte différemment des autres types de référence?

Nous soaps que la chaîne est un type de référence, nous avons donc

ssortingng s="God is great!"; 

mais sur la même note si je déclare la classe say Employee qui est un type de référence, alors pourquoi un morceau de code ci-dessous ne fonctionne pas?

 Employee e = "Saurabh"; 

2- Comment déterminer si un type est un type de référence ou un type de valeur?

Ce code fonctionnerait si vous aviez une conversion implicite d’une chaîne en Employee . Fondamentalement, un littéral de chaîne est de type ssortingng – c’est-à-dire que sa valeur est une référence de chaîne (et une interné en plus). Vous ne pouvez affecter une valeur d’un type à une variable d’un autre type s’il existe une conversion entre les deux types – définie par l’utilisateur ou intégrée. Dans ce cas, il n’y a pas de conversion de ssortingng en Employee , d’où l’erreur.

Contrairement à d’autres réponses, les types ne doivent pas nécessairement être identiques . Par exemple, c’est parfait:

 object x = "ssortingng literal"; 

Cela convient car il existe une conversion de référence implicite de ssortingng en object . De même, vous pouvez écrire:

 XNamespace ns = "some namespace"; 

car il existe une conversion implicite de chaîne en XNamespace .

Pour répondre à votre deuxième question: pour savoir si un type dans .NET est un type de valeur ou un type de référence … les types struct et enum sont des types de valeur; tout le rest (classe, délégué, interface, tableau) est un type de référence. Cela exclut les types de pointeurs, qui sont un peu différents 🙂

Parce qu’ils ne sont pas du même type, si vous définissez un TypeConverter, cela fonctionnera.

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

Les types de référence ne sont pas assignables sauf s’ils sont du même type (c’est ce qu’on appelle le type sécurité). Le premier exemple fonctionne parce que vous affectez un littéral de chaîne à une variable du type System.Ssortingng . Le second exemple ne fonctionne pas car vous affectez un littéral de chaîne à une variable du type Employee . Les types doivent correspondre ou être assignables de droite à gauche pour que l’affectation de valeur fonctionne.

 Employee e = "Saurabh"; 

ne fonctionnera pas simplement parce qu’ils sont de types différents.

 object x; x = new Employee(); x = "Hello World!";