字符串泛型约束的值类型部分

时间:2009-02-24 01:48:23

标签: c#

如果string是值类型,我认为它是,为什么以下声明是合法的:

struct Refsample<T> where T : class

RefSameple<string>; //why is it legal?

深入研究C#,第75页

4 个答案:

答案 0 :(得分:2)

System.String是一种引用类型,尽管它具有值类型的一些特征。

答案 1 :(得分:2)

string是不可变引用类型。

你想说吗?

struct Refsample<T> where T : class

struct本身是值类型,但它可以包含引用类型。

存储在内存堆栈中的值类型变量,但引用类型变量具有指向堆的内存地址。

e.g。

struct Refsample<T> where T : class
{
   // stored in the stack as well.
   public int Age; 

   // memory address pointing to the heap stored in the stack, 
   // but the actual object is stored in the heap.
   public string Name;
   // same as string above if T was reference type;
   // otherwise, if value type, same as Age above.
   public T SomeThing; 
}

答案 2 :(得分:1)

String实际上是行为的引用类型,就像值类型一样。这就是为什么你可以测试一个字符串的null,你不能为int,bool等等。好吧,你可以,但你只会得到默认值0,false等。

答案 3 :(得分:1)

System.String是引用类型而不是值类型。