ToString()和转换为String之间的区别

时间:2015-07-28 07:37:50

标签: c# string casting

string id = (string)result.Rows[0]["Id"];

上面的代码行返回InvalidCastException。为什么会这样呢?

但是如果我将代码更改为此{
1},那么它就可以了。我在上一行代码中做错了什么?

5 个答案:

答案 0 :(得分:4)

它不起作用,因为ID具有不同的类型。它不是string - 所以你可以转换它但不能转换它。

答案 1 :(得分:2)

我想你的行'索引器的类型不是string。演员看起来像这样:

(TypeA)objB

只有在

时才会成功
  1. objB的类型为TypeA

  2. objB的类型为TypeC,其中TypeCTypeA的子类,

  3. objB属于TypeC类型,其中TypeCTypeA的超类,而objB的声明类型为TypeA。< / p>

  4. 所以,你的代码不起作用。

    但是,因为每种类型都来自神圣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转换为字符串,但在其他情况下,您的转换为字符串,这在当前场景中是不可能的。