为什么无法ref string 转换为 ref object

zhghl 2005-01-04 03:52:21
代码如下:

调用方法:

this.myBrowser.Navigate2(this.txtBoxURL.Text);

MyBrowser中的Navigate2方法:

public void Navigate2( string url ){
object Zero = 0;
object EmptyString = "";
this.axWebBrowser.Navigate2( ref url , ref Zero , ref EmptyString , ref EmptyString , ref EmptyString );
}
...全文
721 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivony 2005-01-04
  • 打赏
  • 举报
回复
ref是传引用调用,一个对字符串的引用不可能变成对object的引用。
例如string s;
s就只能引用字符串,而不可能引用其他类型的东西。这与隐式类型转换不同:

object o = a;

这样是可行的,但o是object的引用,而s还是string的引用,不可能把s变成object的引用。
brightheroes 2005-01-04
  • 打赏
  • 举报
回复
同样的道理

public void ...(object obj)
{
.........
}
这样传值的方法
无论你在里面如何处理这个obj
都不会影响到外面的参数,所以允许传递一些参数的扩展类进来
比如说
int i = 10;
...(10);


brightheroes 2005-01-04
  • 打赏
  • 举报
回复
我觉得,MS这样的设计是必须的
ref的参数,要求传递的类型和方法签名完全一致

否则,比如这样

string s = "sdf";

public void (ref object obj)
{
obj = new Form1();
.........
}

就会产生不可预期的结果

所以,为了安全性,.NET不允许这样传递参数
layershow 2005-01-04
  • 打赏
  • 举报
回复
装箱操作
object中保存的都是地址
所以才会有 object Zero = 0;
ref Zero
而不能是 ref 0;

内存 0x??????? -> 0

变量object 0x******* -> 0x????????

ref 0x******* OK 被调用过程得到内容 0x??????? 是一个地址 用它来操作
ref 0x?????? 会导致严重错误 相当于使用了地址 0x0
xixigongzhu 2005-01-04
  • 打赏
  • 举报
回复
楼上的:
虽然字符串也是引用类型,但在堆栈里存储的是这个字符串在常量表的Token
systemspy 2005-01-04
  • 打赏
  • 举报
回复
xixigongzhu(夕夕公主) :

1.字符串和对象都是引用类型

2.字符串和对象都是保存在堆中,而不是堆栈
SeanChen 2005-01-04
  • 打赏
  • 举报
回复
同意楼上的说法
systemspy 2005-01-04
  • 打赏
  • 举报
回复
是因为C#编译器不允许

你可以定议一个如abc(int a)

调用是用abc((long)123)

就会出错

因为C#是用签名来区分方法的,不可以有一调用可以使用两个方法

主要是为了重载
xixigongzhu 2005-01-04
  • 打赏
  • 举报
回复
楼上的难道不知道ref实际上就是传地址吗?
systemspy 2005-01-04
  • 打赏
  • 举报
回复
肯定不行啦 因为字符串和对象在堆栈的存储方式不一样 ???
xixigongzhu 2005-01-04
  • 打赏
  • 举报
回复
肯定不行啦 因为字符串和对象在堆栈的存储方式不一样
layershow 2005-01-04
  • 打赏
  • 举报
回复
就是无法转换,手工转换一下
object objURL = url;

ref objURL;

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧