string id = (string)result.Rows[0]["Id"];
上面的代码行返回InvalidCastException
。为什么会这样呢?
但是如果我将代码更改为此{
1},那么它就可以了。我在上一行代码中做错了什么?
答案 0 :(得分:4)
它不起作用,因为ID
具有不同的类型。它不是string
- 所以你可以转换它但不能转换它。
答案 1 :(得分:2)
我想你的行'索引器的类型不是string
。演员看起来像这样:
(TypeA)objB
只有在
时才会成功 objB
的类型为TypeA
,
objB
的类型为TypeC
,其中TypeC
是TypeA
的子类,
objB
属于TypeC
类型,其中TypeC
是TypeA
的超类,而objB的声明类型为TypeA
。< / p>
所以,你的代码不起作用。
但是,因为每种类型都来自神圣Object
类,所以每种类型都有ToString
方法。因此,无论Rows[0]["Id"]
返回什么类型,它都有或没有ToString
方法的自定义实现。您猜对了ToString
方法的返回值类型String
。这就是ToString
工作的原因。
答案 2 :(得分:2)
让我们看一下不同的操作,比如你和编译器之间的对话:
// here you say to compiler "hey i am 100% sure that it is possible
// to cast this `result.Rows[0]["Id]` to string
// this results in error if cast operation failed
string id = (string)result.Rows[0]["Id"];
// here you say to compiler: "please try to cast it to
// string but be careful as i am unsure that this is possible"
// this results in `null` if cast operation failed
string id = result.Rows[0]["Id"] as string;
// here you say to compiler: "please show me the string representation of
// this result.Rows[0]["Id"] or whatever it is"
// this results in invoking object.ToString() method if type of result.Rows[0]["Id"]
// does not override .ToString() method.
string id = result.Rows[0]["Id"].ToString();
答案 3 :(得分:1)
ToString()
不是简单地投射你的对象,而是调用它的ToString
- 方法提供“字符串表示”。然而,强制转换意味着对象本身就是一个字符串,因此你可以投射它。
另请看这里:Casting to string versus calling ToString
编辑:从ToString
派生的object
- 方法可用于表示任意对象。
MyClass
{
int myInt = 3;
public override string ToString() {
return Convert.ToString(myInt);
}
}
如果在您的类中没有覆盖ToString
,则默认返回值是类的类型名称。
答案 4 :(得分:0)
使用ToString(),您将row0的Id转换为字符串,但在其他情况下,您的转换为字符串,这在当前场景中是不可能的。