我们知道,字符串是引用类型,所以我们必须为什么字符串是引用类型,但行为与其他引用类型不同?
,但是,如果我声明类相同的音符说员工是引用类型,那么为什么下面的代码不能正常工作?
Employee e = "Saurabh";
2-我们如何确定类型是引用类型还是值类型?
我们知道,字符串是引用类型,所以我们必须为什么字符串是引用类型,但行为与其他引用类型不同?
,但是,如果我声明类相同的音符说员工是引用类型,那么为什么下面的代码不能正常工作?
Employee e = "Saurabh";
2-我们如何确定类型是引用类型还是值类型?
该代码会工作。基本上,一个字符串文字的类型是string
- 即它的值是一个字符串引用(以及在那个字符串引用的字符串)。可以,如果有两种类型之间的变换的一种类型的值仅分配给另一种类型的可变 - 无论是用户定义的或内置在这种情况下,没有转换从string
到Employee
,因此错误。
相反,一些其他的答案,类型不必须是相同 - 比如,这是好的:
object x = "string literal";
这很好,因为有从string
到object
隐式引用转换。同样你可以写:
XNamespace ns = "some namespace";
因为有implicit conversion from string to XNamespace
。
要回答第二个问题:要查看.NET中的某个类型是值类型还是引用类型... struct
和enum
类型是值类型;其他一切(类,委托,接口,数组)都是引用类型。这是不包括指针类型,这是一个有点不同:)
引用类型是不可转让的,除非它们是完全相同的类型(这被称为类型安全)。第一个示例的工作原理是将字符串文字分配给类型为System.String
的变量。第二个示例不起作用,因为您正在将字符串文字分配给Employee
类型的变量。类型必须匹配或可从右向左分配才能赋值工作。
Employee e = "Saurabh";
不能简单地工作,因为它们是不同的类型。如果你有一个字符串的隐式转换到Employee
向Employee添加一个隐式运算符,这将起作用。 假设Employee有一个接受字符串参数的构造函数: public static implicit operator Employee(string name) { return new Employee(name); } – 2010-05-05 10:44:06
因为他们是不一样的类型,如果你定义的TypeConverter,然后,将工作。
http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx
哈哈,谢谢史蒂文,很高兴看到你仍然痴迷,你可怜的怪胎。 – heisenberg 2010-09-07 19:43:52
object x;
x = new Employee();
x = "Hello World!";
+1使用'XNamespace'进行隐式转换的绝佳示例。 – 2010-03-16 14:51:00
很好的解释..我被拒绝了,因为这个问题,它真的尴尬,我没有回答这个基本的问题,我搞砸了! – TalentTuner 2010-03-16 14:53:16
我发现很难相信微软会问这么简单的问题(尽管它们很棘手)。但与谷歌面试相比,这没什么。 – JonH 2010-03-16 14:56:24