C# 方法接受对象C时字符串作为引用参数的问题#

C# 方法接受对象C时字符串作为引用参数的问题#,c#,object,reference,immutability,C#,Object,Reference,Immutability,可能重复: 我似乎不明白为什么以下内容在C中不起作用: 这是因为字符串已经引用了一个字符数组,它是不可变的吗?这应该无法编译,谢天谢地,是这样的。假设您在swap方法中将一个整数放入对象a或b中。这根本不可能,因为实际引用的是string类型的对象 您可以在动态类型的脚本语言(如JavaScript或PHP)中实现这种行为,因为任何东西都只是一个“var”。但是在像C#这样的静态类型语言中,这是不可能的。我必须再次链接到Eric Lippert(今天第二次!)关于这个主题的博客帖子: 基本上

可能重复:

我似乎不明白为什么以下内容在C中不起作用:


这是因为字符串已经引用了一个字符数组,它是不可变的吗?

这应该无法编译,谢天谢地,是这样的。假设您在swap方法中将一个整数放入对象a或b中。这根本不可能,因为实际引用的是string类型的对象


您可以在动态类型的脚本语言(如JavaScript或PHP)中实现这种行为,因为任何东西都只是一个“var”。但是在像C#这样的静态类型语言中,这是不可能的。

我必须再次链接到Eric Lippert(今天第二次!)关于这个主题的博客帖子:

基本上,允许这种转换会破坏类型安全性,因为您可以更改对象引用以保存另一个与调用方传入的任何类型都不匹配的类型

ref和out参数均不可用 在呼叫站点的类型不同。做 否则将断开可验证类型 安全

这是一个复制品

看看为什么它不起作用的答案

要使其工作,您可以创建一个通用方法:

public static void Swap<T>(ref T a, ref T b) 
{
    T t = b;     
    b = a;     
    a = t; 
}
公共静态无效交换(参考T a,参考T b)
{
T=b;
b=a;
a=t;
}

现在所有的类型都检查出来了。

你必须说明它为什么不工作。它不会按原样编译,而且不仅仅是类型。它的示例函数几乎完全相同,只是它使用了泛型。换句话说,
ref
参数是不变的(即,你必须使用完全相同的类型)。这是因为它们必须是逆变的(与正常参数一样)和协变的(与返回类型一样)。如果将
fname
lname
更改为type
Object
,这将正常工作。您可以在Eric Lippert的博客上阅读更多内容:
public static void Swap<T>(ref T a, ref T b) 
{
    T t = b;     
    b = a;     
    a = t; 
}