Задать вопрос
BadCats
@BadCats

Какие отношения между типами данных в c#, .net и windows, в контексте использования алиасов?

Предистория
Прошу взлянуть на темму созданную мной на другом форуме (чисто для понимания общей картины)
www.cyberforum.ru/csharp-beginners/thread1664793.html

Я хотел понять почему в с# можно использовать псевдоним для любого целого типа данных
(byte, sbyte, short, ushort, int, uint, long, ulong) , но нельзя
использовать любой системный целый тип данных C# (Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64) ?

Полное описание данного вопроса уже было приведено мной на Тостере:
Псевдонимы(алиасы) в перечисления — правила использования (c#)?
в итоге это оказался баг, который исправили в версии языка C# 6.0, но теперь я пытаюсь понять суть бага.
На вышеуказанном форуме мне дали ссылку
https://social.msdn.microsoft.com/Forums/en-US/70b...
и меня зацепило следуещще:
Well, technically speaking System.Int16 is a value type ﴾structure﴿ which has one 'short' field. You cannot use
value type as enum underlying type ‐ IMO that's why you get the error.
This is definitely the reason why you cannot do this in IL language.
However I can imagine that a .NET language could choose to hide this technical difference from developer in
that language. C# didn't choose to hide it in this case. If you want to know why, I'd recommend to ask on
C# language forum.
‐Karel

ответ на первую цитату:
"short" and "System.Int16" are one and the same.
They are both value types ‐ "short" is just an alias for the System.Int16 value type.
I'm not sure what you mean when you say that System.Int16 has one 'short' field ‐ it doesn't ‐ it has the
same members and fields as 'short' since it's the same type.

ответ на ответ:
You are right that C# considers 'short' as alias for 'System.Int16' ﴾as this MSDN doc mentions﴿. Therefore
this particular question should be probably raised on C# forum.
I interpreted 'short' as equivalent to 'signed 16‐bit integer' which is named 'int16' in IL/CLI, where it is
indeed different: int16 and System.Int16 are tight together, but technically they are not the same in CLI.
int16 corresponds to the unboxed value type System.Int16.
Note that System.Int16 cannot be used at many places where int16 ﴾ELEMENT_TYPE_I2﴿ can be used ﴾e.g. in
signatures and custom attributes encoding﴿.
On the other hand int16 ﴾ELEMENT_TYPE_I2﴿ cannot be used for method calls, because it is not a BCL type.
That's where System.Int16 comes handy.
You can also confirm that by running ildasm.exe on mscorlib.dll. Here's how System.Int16 is defined:
.class public sequential ansi serializable sealed beforefieldinit System.Int16
extends System.ValueType
implements System.IComparable,
System.IFormattable,
System.IConvertible,
class System.IComparable`1<int16>,
class System.IEquatable`1<int16>
{
.field assembly int16 m_value // Note: This is not recursive definition
// And more ...
}

Sorry for the confusion,
‐Karel

Мне нужно твое мнение по поводу этих цитат. Всем Заранее Спасибо!
мне необходимо узнать: есть ли крупица смысла(смысла про то, что в IL коде это все же разные типы) в этих цитатах-предположениях или это просто бред?
Дали такой ответ:
BadCats, ну почему, человека понять можно. Он говорит о том, что для программиста short и Int16 это один и тот же тип, но для рантайма это разные вещи. Из шарпа ты отличий никогда не увидишь, потому что на уровне языка это опять же одно и то же (примитивное typeof(short) == typeof(Int16) это подтвердит), а вот на нижележащих уровнях это разные вещи, потому что Int16 - это структура, в которую упаковывается "настоящее" число при боксинге, а при анбоксинге соответственно оно достается. Соответственно т.к. вызовы методов (по крайней мере через интерфейс) без боксинга невозможны, то и вызывать их можно только на "взрослой" структуре. Про случаи, когда можно использовать только число, но нельзя структуру немного не понял - слишком низкоуровневые вещи затронуты.

НО у меня возник следующий вопрос:
каким боком(цитаты на английском ) это к несовместимости (в версии C# младше 6.0) алиасов и "полноценных типов" в перичислениях? Короче вопрос всей этой темы( Псевдонимы(алиасы) в перечисления — правила использования (c#)? ), применительно к этим ответам на MSDN
Кому вообщем интересна эта тема путаниц при использовании алиасов, вот ссылки на другие источники

1)Официалный ответ Microsoft на данный баг(ссылка на архив с сохраненным ответом т. к. оригинальная страница была удалена): https://web.archive.org/web/20140310042420/http://...

2) stackoverflow.com/questions/7511102/changing-the-u...

3)http://ru.stackoverflow.com/questions/496085/Псевд...
4)stackoverflow.com/questions/5005319/why-cant-i-dec...
  • Вопрос задан
  • 339 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Какую проблему вы хотите решить?

Int32 это тип данных из рантайма .Net, int это тип данных из C#. Мне кажется вполне логическим что в enum-е(который является частью C#) можно использовать только C# типы. То что C# построен на базе .Net не значить, что типы должны быть взаимозаменяемыми, это даже наверное плохо. Поскольку в случаии изменения спецификации рантайма, то пострадает и код написаный на C#. А так можно менять рантайм сколько угодно, но код будет работать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы