Ответ 1
Разница заключается в том, что string
является ссылочным типом, а char
- это ключевое слово, которое представляет .Net Framework Char Структура. Когда вы вызываете Char.ToUpper('a')
, вы фактически используете структуру Char в С#. Структуры Типы значений. Типы значений неизменяемы.
Поскольку структуры неизменяемы, методы, которые воздействуют на структуру, не работают должным образом (см. Почему Mutable Structs Evil). Таким образом, необходимы статические методы. При вызове Char.ToUpper(aChar)
вы фактически не меняете aChar, вместо этого вы создаете новый экземпляр символа, который является прописным представлением символа, который вы передали в качестве параметра, и возвращающего его. Пример ниже демонстрирует это.
Char aChar = 'a';
Char.ToUpper(aChar);
//aChar still equals 'a'
Char bChar = 'b';
bChar = Char.ToUpper(bChar);
//bChar now equals 'B'
Причина Char имеет другие методы, позволяющие делать такие вещи, как 'a'.Equals('a');
, потому что типы значений и ссылочные типы наследуются от Object, который определяет эти методы (технически, типы значений имеют тип System.ValueType
, который наследует от System.Object
). Эти методы не вносят никаких изменений в сам объект.
Изменить - почему этот вопрос на самом деле является предположением
Как мне очень любопытно узнать, есть ли реальный ответ на вопрос "почему char
не имеет метода .ToUpper()
", я решил проверить Документ спецификации языка CSharp 5, я нашел следующее:
char
является интегральным типом (pg 80), который является подмножеством простых типов. Простые типы сами по себе являются предопределенными типами Struct. Типы типов - это типы значений, которые "могут объявлять константы, поля, методы, свойства, индексы, операторы, конструкторы экземпляров, статические конструкторы и вложенные типы" (стр. 79).
string
- тип класса, который является ссылочным типом (pg 85). Типы классов определяют "структуру данных, которая содержит члены данных (константы и поля), члены функций (методы, свойства, события, индексы, операторы, конструкторы экземпляров, деструкторы и статические конструкторы) и вложенные типы" (стр. 84).
На этом этапе очевидно, что char
может поддерживать метод .ToUpper()
(поэтому работает метод расширения). Однако, как говорится в этом вопросе, они не поддерживают его. В этот момент я убежден, что любые рассуждения о том, почему это так, - это чистое предположение (если вы, конечно, не работаете в команде С#).