2015-07-28 2 views
1
string id = (string)result.Rows[0]["Id"]; 

Выше строки кода возвращается InvalidCastException. Почему это так?Разница между ToString() и литьем до строки

Но если изменить код этого

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

то, что он работает. Я сделал что-то неправильно в моей предыдущей строке кода?

+1

Связанный: http://stackoverflow.com/q/1565100/447156 и http://stackoverflow.com/q/4152205/447156 –

+1

'CAST' и' Convert' - это две разные концепции. –

+0

Обратите внимание, что метод '.ToString' предназначен для всех объектов. он может вернуть имя объекта, а не свойство ('id'), которое вы хотите. –

ответ

4

не работает, потому что ID имеет другой тип. Это не string - так что вы можете конвертировать его, но не бросать его.

1

ToString() не просто бросает ваш объект, он называет его ToString -методом, предоставляющим «строковое представление». Кастинг, однако, означает, что сам объект является строкой, и поэтому вы можете ее отличить.

также посмотреть здесь: Casting to string versus calling ToString

EDIT: ToString -метод, полученный из object может быть использован, чтобы дать представление любого произвольного объекта.

MyClass 
{ 
    int myInt = 3; 
    public override string ToString() { 
     return Convert.ToString(myInt); 
    } 
} 

Если ToString не переопределен в классе, чем подмигнули по умолчанию возвращаемого значения является class' имяТипа.

0

С помощью ToString() вы преобразовываете идентификатор строки в строку, но в другом случае вы производите его как строку, которая невозможна в текущем сценарии.

2

Я предполагаю, что ваш индексный указатель строк не string. Литая выглядит следующим образом:

(TypeA)objB 

Это только успешным, когда

  1. objB имеет тип TypeA,

  2. objB имеет тип TypeC где TypeC является подклассом TypeA,

  3. objB i с типа TypeC, где TypeC является суперклассом TypeA, а тип объявления objB - TypeA.

Таким образом, ваш код не работает.

Однако, поскольку каждый тип является производным от священного Object класса, каждый тип имеет метод ToString. Таким образом, независимо от типа Rows[0]["Id"], он имеет или не имеет специальной реализации метода ToString. Тип возвращаемого значения метода ToString всегда, как вы уже догадались, String. Вот почему работает ToString.

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(); 
Смежные вопросы