C# 显式转换是否修改对象?

C# 显式转换是否修改对象?,c#,asp.net,string,server-variables,explicit-conversion,C#,Asp.net,String,Server Variables,Explicit Conversion,像(string)object这样的显式转换是否会修改对象本身? 当我在ASP.NET中用visual C#编写代码时,我遇到了一件奇怪的事情: I类型: NameValueCollection coll; coll = Request.ServerVariables; LoginStatue1.Text += coll.GetValues("REMOTE_USER")[0] + "." + (string)coll["REMOTE_USER"] + "." + coll.GetValues("

(string)object
这样的显式转换是否会修改对象本身? 当我在ASP.NET中用visual C#编写代码时,我遇到了一件奇怪的事情:

I类型:

NameValueCollection coll;
coll = Request.ServerVariables;
LoginStatue1.Text += coll.GetValues("REMOTE_USER")[0] + "." + (string)coll["REMOTE_USER"] + "." + coll.GetValues("REMOTE_USER")[0];
结果是

..用户名

这意味着第一个
coll.GetValues(“远程用户”)[0]
(string)coll[“远程用户”]
之后不获取任何内容,第二个
coll.GetValues(“远程用户”)[0]
获取用户名


那么显式转换会改变对象本身吗?

是的,当然,显式转换会改变对象。 首先,您将无法将对象强制转换为字符串,C#不允许

如果您能够强制转换,对象的行为将与当前数据类型类似,例如

class Program
{
    static void Main(string[] args)
    {
        int i = 0;
        char j = (char)i;
        j--;
        Console.WriteLine(j);
    }
}
输出:?
请注意,输出不是-1,因为行为发生了变化。

为了让事情更清楚,我建议尝试以下方法:

LoginStatue1.Text =  string.Format("1st=({0}),2nd=({1}),3rd=({2})", 
coll.GetValues("REMOTE_USER")[0],  
(string) coll["REMOTE_USER"], 
coll.GetValues("REMOTE_USER")[0]);
结果是什么?我希望第一项和第三项是一样的

e、 g.如果我运行这个自包含的示例:

        NameValueCollection  coll;
        coll = new NameValueCollection();
        coll.Add("REMOTE_USER", "Tom");
        coll.Add("REMOTE_USER", "Dick");
        coll.Add("REMOTE_USER", "Harry");
        LoginStatue1.Text =  string.Format("1st=({0}),2nd=({1}),3rd=({2})", coll.GetValues("REMOTE_USER")[0],  (string) coll["REMOTE_USER"], coll.GetValues("REMOTE_USER")[0]);

我得到:1st=(Tom),2nd=(Tom,Dick,Harry),3rd=(Tom)

显式转换运算符通常是不可变的,但在处理可变引用类型时可能会有潜在的副作用。您的问题没有提供足够的详细信息,无法确定发生了什么。您可以定义自定义显式运算符(显式转换),以返回对象的新实例<代码>公共静态显式运算符字符串(对象i){return“对象为:“+i.ToString();}显式强制转换不影响基础对象,事实上,它在这种情况下没有任何效果,因为
NameValueCollection
indexer属性的结果已经是
string
类型。将对象转换为string应该是不可变的,但我不能确定这个特定的示例,因为我们没有足够的信息来确定到底发生了什么。如果可能,您需要进入这段代码带有调试器。coll.GetValues()返回了一些内容,这意味着
NameValueCollection
包含您所请求的键,否则您将从
[0]
索引中获得异常。上面的代码正是您正在使用的代码吗?大多数本机显式转换函数是不可变的,将创建一个新引用来保存值,而不是在适当的位置更改值,因此答案的第一行是不正确的。因此,这意味着大多数转换将为重复创建一个位置,然后再对其进行转换,然后将其分配给目标变量,对吗?