对象到System.String的隐式转换

3

I have a question regarding type conversion in C#.


Object data_obj = "test";
string data_str;
data_str = data_obj;<br>

这会产生一个错误,声称不存在隐式转换。对于我来说,这至少有点不直观,因为Console.WriteLine("type{0}",data_obj.GetType())会产生System.String,但是我真的很新C#。

现在,我想要转换为存储在data_obj中的数据类型,而不必手动switch和选择类型。

所以,基本上,我的问题是:是否有一种方法可以从System.Object定义隐式转换为System.StringSystem.Decimal等。

上下文:

我正在从ODBC连接到SQLServer数据库并尝试将这些行推送到Oracle数据库。现在,必须定义SQLServer和Oracle行的对应关系。现在,我毫不费力地从SQLServer表中读取数据,并将其存储在List<Dictionary<string,Object>>中(我知道,存储行似乎是错误的,但设计要求如此,你能做什么)。

插入部分是我在插入时遇到问题的地方。我基本上通过foreach循环遍历列表的元素,并逐行插入它们。就是在这里,我需要确定存储在Object中的数据类型。

编辑:包括更多细节。


1
即使您可以添加隐式转换,您所做的只是避免编写 (string)(或其他类型) 。如果您想将其存储在变量中,则仍需弄清楚它是什么类型,该变量必须定义为该类型,因此您仍需要使用 switchif 语句。 - Richard Marskell - Drackir
5个回答

16

没有隐式的方法可以完成它。以下是几种选项:

  • 显式调用ToString()(如果引用为null,则会引发异常)
  • 调用Convert.ToString()
  • 使用"" + data_obj(不要这样做,很丑陋)
  • 如果您确信data_obj确实是一个字符串,则进行类型转换。

但是,您为什么如此热衷于隐式转换呢?


我只是有点懒。我有一些数据要插入到数据库表中,我想一次性完成。但我认为我会选择较长的方式来完成它。 - horacv
2
@horacv:我怀疑可能有更好的方法来完成这个任务,但是如果没有更多的上下文信息,很难知道具体是什么。如果您在问题中添加更多细节,我们或许可以提供更多帮助。 - Jon Skeet

2

如上所述,您在代码中应该进行转换而不是转换。 问题的对象一个字符串; 您只需将其存储在对象引用中。

转换应该像这样完成:

data_str = (string)data_obj;

您提到的 Console.Writeline 的重载需要一个格式字符串,然后是一个 object 数组,而不是字符串。它会调用每个对象的 ToString() 方法。因此,您对 data_obj.GetType().ToString() 的调用可以简化为 data_obj.GetType()(在字符串上调用 ToString() 只会再次返回该字符串)。
至于从 object 到类型 x 的隐式转换...想想您正在询问什么;object 的引用可以是任何 CLR 类型。如何处理这些转换?

我不确定我理解你所说的“处理这些转换”的意思。如果lvalue是字符串,而rvalue是存储字符串的对象,那么应该没有问题。 - horacv
1
可以是“任何东西”,但不能是指针。 - Adam Robinson
@horacv:再次强调,你并没有进行转换...你只是在进行类型转换(至少,在这种情况下,你不应该进行转换;这是毫无意义的)。问题在于,编译器无法知道你传递给它的“object”引用是一个“string”,因为它可以是任何CLR类型。通过强制显式转换,你告诉编译器:“没关系,我知道这将是一个‘string’,所以继续做这个...”,如果你错了,你会得到一个异常。 - Andrew Barber
我不确定你所说的“无法知道”的意思。它绝对有一种方法可以知道一个“Object”包含的数据类型,因为它可以通过分配给这个“Object”的值的数据类型来推断它。 - horacv
很抱歉!我现在知道我的问题出在哪里了!GetType() 实际上是在运行时完成的! - horacv
显示剩余7条评论

1
你可以使用 Convert.ToString 方法:
object o = ...
string s = Convert.ToString(o);

@George,没有隐式转换可用。 - Darin Dimitrov

0

在C#中,从objectstring没有隐式转换。但是你可以调用对象的虚拟ToString方法。

string s = o.ToString(); 

0
如果您将值存储在变量中而不是类型对象中,并让编译器决定该值是什么,那么它可以被隐式地设置。
var data_obj = "test";
string data_str;
data_str = data_obj;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接