为什么类型.如果String是引用类型,则IsByRef返回false

本文关键字:IsByRef 返回 false 引用类型 类型 如果 String 为什么 | 更新日期: 2023-09-27 18:13:42

据此,string(或string)是引用类型。

Yet given:

Type t = typeof(string);
然后

if (t.IsByRef) ...    

返回false

为什么?

编辑:经过一些快速测试,我显然误解了IsByRef的目的…即使使用类名代替'string',也会返回false。我正在编写一个泛型类,并希望测试当泛型实例化时传递的类型是否为值或引用类型。如何检验这个呢?

为什么类型.如果String是引用类型,则IsByRef返回false

您应该使用IsValueType:

bool f = !typeof (string).IsValueType; //return true;

对于IsByRef,该属性的目的是确定参数是通过引用还是通过值传递给方法。

例子你有一个方法a是通过ref:

传递的
public static void Foo(ref int a)
{
}

判断a是否通过引用传递:

  bool f = typeof (Program).GetMethod("Foo")
                                 .GetParameters()
                                 .First()
                                 .ParameterType
                                 .IsByRef;   //return true

有"引用类型"——我们有!type.IsValueType——然后有类型表示任何的引用——无论它们的目标是值类型还是引用类型。

当你说void Foo(ref int x)时,x被称为"通过引用传递",因此是ByRef
在底层,x 一个类型为ref int引用,对应于typeof(int).MakeReferenceType()

请注意,这是两种不同的"引用",彼此完全正交。

(事实上,还有第三种"引用",System.TypedReference,它只是一个struct
还有第四种类型的引用,每个C程序员都知道——指针,T*)

您需要检查它是否是一个值类型

typeof(object).IsValueType :- false
typeof(int).IsValueType :- true