【发布时间】:2013-10-26 19:32:00
【问题描述】:
像(string)object 这样的显式转换会修改对象本身吗?
当我在 ASP.NET 中使用 Visual C# 进行编码时,我遇到了一件奇怪的事情:
我输入:
NameValueCollection coll;
coll = Request.ServerVariables;
LoginStatue1.Text += coll.GetValues("REMOTE_USER")[0] + "." + (string)coll["REMOTE_USER"] + "." + coll.GetValues("REMOTE_USER")[0];
结果是
..用户名
这意味着第一个coll.GetValues("REMOTE_USER")[0] 没有得到任何东西,而在(string)coll["REMOTE_USER"] 之后,第二个coll.GetValues("REMOTE_USER")[0] 得到用户名。
那么显式转换会改变对象本身吗?
【问题讨论】:
-
显式转换运算符通常是不可变的,但在使用可变引用类型时可能会产生潜在的副作用。您的问题没有提供足够的细节来确定发生了什么。
-
您可以定义返回新对象实例的自定义显式运算符(显式转换)。
public static explicit operator string(object i) { return "Object is: "+ i.ToString(); } -
显式强制转换不会影响底层对象,实际上在这种情况下它没有任何影响,因为
NameValueCollection索引器属性的结果已经是string类型。 -
将对象转换为字符串应该是不可变的,但我不能确定这个具体的例子,因为我们没有足够的信息来确定到底发生了什么。
-
如果可能,您需要使用调试器单步执行代码。 coll.GetValues() 正在返回一些东西,这意味着
NameValueCollection包含您要求的密钥,否则您会从[0]索引中得到一个异常。上面的代码就是你正在使用的代码吗?
标签: c# asp.net string server-variables explicit-conversion