因为它们是引用,所以逆变ref
和参数丢失。out
这意味着当您将普通参数传递给方法时,CLR 将解决对该值的引用并将该值作为参数传递,而当参数是ref
或时, out
CLR 会将整个引用作为参数传递。.NET 中的引用类型是WeakReference<T>
并且您将引用包含在其中。
给定的通用参数WeakReference<T>
是您引用的类型,例如:
public void Test<T>(ref T reference)
{
WeakReference<T> weakReference = __makeref(reference);
}
现在,我将更深入地举另一个例子:
public void Test(ref string reference)
{
WeakReference<string> weakReference = __makeref(reference);
}
这是另外一个:
public void Test(ref string reference)
{
WeakReference<object> weakReference = __makeref(reference);
}
后一个示例会给您一个编译器错误:如您所见,泛型参数不是逆变的。因此,当您将参数的引用包装到 aWeakReference<T>
时,T
必须正是该参数的类型。
即使您不使用__makeref
,您也可以理解 CLR 的内部行为是这样的。
此外,在较低级别中,引用是包含值类型和值本身的结构。因此,如果您可以将引用转换为它的任何超类型,您将更改引用的类型,当您尝试获取它的值时,它会失败,因为值的类型因引用的类型而异在。