Подскажите, как бы вы решили задачу приведения типов?
Есть объект А и объект Б, необходимо вычислить тип разрешения операции над ними, допустим, если это UInt16 и UInt32 , то разрешением будет тип UInt32. Хотелось бы написать эту процедуру лаконично и прозрачно.
Здравствуйте, Pavel M., Вы писали:
PM>Подскажите, как бы вы решили задачу приведения типов?
PM>Есть объект А и объект Б, необходимо вычислить тип разрешения операции над ними, допустим, если это UInt16 и UInt32 , то разрешением будет тип UInt32. Хотелось бы написать эту процедуру лаконично и прозрачно.
Не понял, что такое "тип разрешения операции". Например, каким он будет для int и string?
Здравствуйте, Pavel M., Вы писали:
PM>Подскажите, как бы вы решили задачу приведения типов?
PM>Есть объект А и объект Б, необходимо вычислить тип разрешения операции над ними, допустим, если это UInt16 и UInt32 , то разрешением будет тип UInt32. Хотелось бы написать эту процедуру лаконично и прозрачно.
Не понятно что значит "вычислить тип разрешения операции над ними".
Если Вы имеете ввиду что-то типа "получить список бинарных операторов, которые применимы над операндами типов А и Б", то это достаточно сложная задача
Операторы бывают и с операндами разных типов...
Придётся оценить все user-defined операторы типов А и Б и их наследников и иметь возможность проверить, существует ли implicit конверсия между двумя типами + не забыть про built-in операторы. То есть в Вашем примере если нашёлся бы operator+ у UInt32 с сигнатурой (UInt32 a, UInt32 b), то надо было бы проверить существует ли implicit конверсия из UInt16 в UInt32, только тогда можно было бы быть уверенным что оператор применим Хотя это правила C#, неясно какие у Вас там законы мироздания...
Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, 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), если возможно. Интересует, как написать покороче код, чтобы он для двух типов операндов выдавал результат операции над ними.
Здравствуйте, Pavel M., Вы писали:
PM>Я реализую операции для парсера, например "сложение" и вычитание, пытаюсь сделать грамотную систему разрешения (не в плане "мама сыну разрешила", а разрешаться — то есть приходить к результату) типов для стандартных, пользовательские не интересуют и переводятся в Object.ToSting(), либо Object.ToString(IFormatProvider), если возможно. Интересует, как написать покороче код, чтобы он для двух типов операндов выдавал результат операции над ними.
Нужно взять список предопределенных операторов и предопределенных неявных преобразований из спецификации C#. Потом выбирать применимые операторы к данным операндам, и между ними делать overload resolution.
Здравствуйте, Pavel M., Вы писали:
PM>Я реализую операции для парсера, например "сложение" и вычитание, пытаюсь сделать грамотную систему разрешения (не в плане "мама сыну разрешила", а разрешаться — то есть приходить к результату) типов для стандартных, пользовательские не интересуют и переводятся в Object.ToSting(), либо Object.ToString(IFormatProvider), если возможно. Интересует, как написать покороче код, чтобы он для двух типов операндов выдавал результат операции над ними.
Тогда Вам всего лишь нужна таблица bool[,] для стандартных числовых типов, показывающая существует ли неявное приведение между двумя типами. Информацию для заполнения можно взять из спецификации C# (пункты 6.1.2 и 6.2.1).
Имея эту таблицу, можно выяснить, можно ли неявно привести А к Б или Б к А, что позволит выяснить нужный Вам "тип операции".