4

Куратор сегодня задал вопрос: «В каком случае используется System.Int32 вместо int, System.String вместо string, и так далее при объявлении типа?»

Ведь это одно и тоже, так? Но он сказал, что есть ситуации, когда нужно указывать System.*.

Arhadthedev
  • 11,528
  • 1
    Можно использовать в любом, с точки зрения языка это одно и то же. – VladD May 18 '16 at 06:30
  • 1
    Можно предположить, что имеется в виду получение типа по его имени, через рефлексию -- там, вероятно (не проверял), допустимо только "строгое" имя типа. – nzeemin May 18 '16 at 06:37
  • 3
    nameof(System.Int32) компилируется, а nameof(int) - нет. – i-one May 18 '16 at 06:56
  • @nzeemin: Ага, вы правы: http://ideone.com/JflwaE – VladD May 18 '16 at 08:25
  • 1
    @VladD, какая-то странная проверка :-) int и т.д. это ж на время compile-time только, а рефлексия в run-time - естественно там ничего похожего быть не может – Grundy May 18 '16 at 12:30
  • Может собрать все эти примеры: nameof, строковые литералы, - и сделать общий ответ? – Alexander Petrov May 18 '16 at 12:31
  • @i-one, в nameof вообще довольно много ограничений на то, что можно подставить – Grundy May 18 '16 at 12:35
  • @Grundy: Угу. Во время компиляции отличий (почти) нету, для языка это одно и то же. А вот в рантайма, при общении с CLR, видно, что int существует лишь во время компиляции. – VladD May 18 '16 at 12:55
  • @VladD, а какие отличия во время компиляции? – Grundy May 18 '16 at 12:58
  • @Grundy: Ну, то же nameof, например. А ещё в старых версиях языка enum можно было наследовать от int, но не System.Int32. – VladD May 18 '16 at 15:13
  • @VladD, ну nameof там вообще что-то они написали кучу ограничений, а enum да, но это тоже уже побеждено :) – Grundy May 18 '16 at 15:19
  • Надеюсь, что и с nameof как-то разберутся. – VladD May 18 '16 at 15:56
  • @Grundy, я в том смысле, что, например, typeof и sizeof принимают оба варианта. Тут аналогично просится. Неконсистентность некоторая. – i-one May 19 '16 at 05:12
  • @i-one, а я про то, что в справке по nameof - прямо описаны варианты которые допустимы и какие нет. В то время как, например при определении enum такого не было – Grundy May 19 '16 at 06:02

1 Answers1

6

int является ключевым словом, которое, в свою очередь, является псевдонимом System.Int32. Это высечено в спецификации, поэтому трактовке и изменениям не подлежит. Следовательно, таких ситуаций в языке C# нет.

Всё это относится и к другим «встроенным» типам(string, float, object и т.д).


Хотя это и не относится непосредственно к вопросу, тем не менее, int не получится использовать в выражении nameof — придётся использовать System.Int32. Хотя подобное использование, на мой взгляд, интересно лишь в познавательном ключе и никакого практического применения не имеет.

ixSci
  • 23,825