可能重复:
C# : Why doesn't 'ref' and 'out' support polymorphism?
我似乎无法理解为什么以下内容在C#中不起作用:
public static void Swap(ref Object a, ref Object b) {
Object t = b;
b = a;
a = t;
}
//Calls
String fname = "Ford";
Strinf lname = "James";
Swap(ref lname, ref fname);
这是因为String已经引用了char数组,它是不可变的吗?
答案 0 :(得分:9)
这是
的副本Why doesn't 'ref' and 'out' support polymorphism?
请参阅答案,了解它为什么不起作用。
为了使其有效,您可以制作通用方法:
public static void Swap<T>(ref T a, ref T b)
{
T t = b;
b = a;
a = t;
}
现在所有类型都会检查出来。
答案 1 :(得分:3)
我再次必须链接到Eric Lippert的博客文章(今天第二次!)关于这个话题:
Why do ref and out parameters not allow type variation?
基本上允许这种转换会破坏类型安全性,因为你可以更改对象引用以保存另一种与调用者传入的类型不匹配的类型。
参考和参数都没有 呼叫站点的类型不同。去做 否则就是打破可验证的类型 安全
答案 2 :(得分:2)
这应该无法编译,谢天谢地。想象一下,在swap方法中将整数放入对象a或b中。这根本不可能,因为实际的引用是一个string类型的对象。
您可能会使用动态类型的脚本语言(如JavaScript或PHP)来消除此类行为,因为无论如何一切都只是'var'。但是在像C#这样的静态类型语言中,这是不可能的。