Разрешение типов
От: Pavel M. Россия  
Дата: 29.11.09 14:30
Оценка:
Подскажите, как бы вы решили задачу приведения типов?

Есть объект А и объект Б, необходимо вычислить тип разрешения операции над ними, допустим, если это UInt16 и UInt32 , то разрешением будет тип UInt32. Хотелось бы написать эту процедуру лаконично и прозрачно.

Спасибо
--------------------------
less think — do more
Re: Разрешение типов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 29.11.09 14:33
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>Подскажите, как бы вы решили задачу приведения типов?


PM>Есть объект А и объект Б, необходимо вычислить тип разрешения операции над ними, допустим, если это UInt16 и UInt32 , то разрешением будет тип UInt32. Хотелось бы написать эту процедуру лаконично и прозрачно.


Не понял, что такое "тип разрешения операции". Например, каким он будет для int и string?
Re: Разрешение типов
От: Пельмешко Россия blog
Дата: 29.11.09 14:41
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>Подскажите, как бы вы решили задачу приведения типов?


PM>Есть объект А и объект Б, необходимо вычислить тип разрешения операции над ними, допустим, если это UInt16 и UInt32 , то разрешением будет тип UInt32. Хотелось бы написать эту процедуру лаконично и прозрачно.


Не понятно что значит "вычислить тип разрешения операции над ними".
Если Вы имеете ввиду что-то типа "получить список бинарных операторов, которые применимы над операндами типов А и Б", то это достаточно сложная задача

Операторы бывают и с операндами разных типов...
Придётся оценить все user-defined операторы типов А и Б и их наследников и иметь возможность проверить, существует ли implicit конверсия между двумя типами + не забыть про built-in операторы. То есть в Вашем примере если нашёлся бы operator+ у UInt32 с сигнатурой (UInt32 a, UInt32 b), то надо было бы проверить существует ли implicit конверсия из UInt16 в UInt32, только тогда можно было бы быть уверенным что оператор применим Хотя это правила C#, неясно какие у Вас там законы мироздания...
Re[2]: Разрешение типов
От: Pavel M. Россия  
Дата: 29.11.09 14:46
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, Pavel M., Вы писали:


PM>>Подскажите, как бы вы решили задачу приведения типов?


PM>>Есть объект А и объект Б, необходимо вычислить тип разрешения операции над ними, допустим, если это UInt16 и UInt32 , то разрешением будет тип UInt32. Хотелось бы написать эту процедуру лаконично и прозрачно.


П>Не понятно что значит "вычислить тип разрешения операции над ними".

П>Если Вы имеете ввиду что-то типа "получить список бинарных операторов, которые применимы над операндами типов А и Б", то это достаточно сложная задача

П>Операторы бывают и с операндами разных типов...

П>Придётся оценить все user-defined операторы типов А и Б и их наследников и иметь возможность проверить, существует ли implicit конверсия между двумя типами + не забыть про built-in операторы. То есть в Вашем примере если нашёлся бы operator+ у UInt32 с сигнатурой (UInt32 a, UInt32 b), то надо было бы проверить существует ли implicit конверсия из UInt16 в UInt32, только тогда можно было бы быть уверенным что оператор применим Хотя это правила C#, неясно какие у Вас там законы мироздания...

Я реализую операции для парсера, например "сложение" и вычитание, пытаюсь сделать грамотную систему разрешения (не в плане "мама сыну разрешила", а разрешаться — то есть приходить к результату) типов для стандартных, пользовательские не интересуют и переводятся в Object.ToSting(), либо Object.ToString(IFormatProvider), если возможно. Интересует, как написать покороче код, чтобы он для двух типов операндов выдавал результат операции над ними.
--------------------------
less think — do more
Re[3]: Разрешение типов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 29.11.09 14:51
Оценка: +1
Здравствуйте, Pavel M., Вы писали:

PM>Я реализую операции для парсера, например "сложение" и вычитание, пытаюсь сделать грамотную систему разрешения (не в плане "мама сыну разрешила", а разрешаться — то есть приходить к результату) типов для стандартных, пользовательские не интересуют и переводятся в Object.ToSting(), либо Object.ToString(IFormatProvider), если возможно. Интересует, как написать покороче код, чтобы он для двух типов операндов выдавал результат операции над ними.


Нужно взять список предопределенных операторов и предопределенных неявных преобразований из спецификации C#. Потом выбирать применимые операторы к данным операндам, и между ними делать overload resolution.
Re[3]: Разрешение типов
От: Пельмешко Россия blog
Дата: 29.11.09 15:09
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>Я реализую операции для парсера, например "сложение" и вычитание, пытаюсь сделать грамотную систему разрешения (не в плане "мама сыну разрешила", а разрешаться — то есть приходить к результату) типов для стандартных, пользовательские не интересуют и переводятся в Object.ToSting(), либо Object.ToString(IFormatProvider), если возможно. Интересует, как написать покороче код, чтобы он для двух типов операндов выдавал результат операции над ними.


Тогда Вам всего лишь нужна таблица bool[,] для стандартных числовых типов, показывающая существует ли неявное приведение между двумя типами. Информацию для заполнения можно взять из спецификации C# (пункты 6.1.2 и 6.2.1).

Имея эту таблицу, можно выяснить, можно ли неявно привести А к Б или Б к А, что позволит выяснить нужный Вам "тип операции".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.