Проблемы неявного приведения (целочисленные литералы) - PullRequest
0 голосов
/ 19 сентября 2018

Я занимаюсь разработкой пользовательских классов Int / UInt для больших целых чисел.Они прекрасно работают с присваиванием / приведением / арифметикой и т. Д. Однако, это выявило проблему, которая возникает с xunit и MSTest.

Вот мой код:

UInt240 x = 0x7fffffff;
Assert.Equal(0x7fffffff, x);

Проблема в том, что если я предоставлю тип без знака на правой стороне, и предоставлю литерал на левой стороне, он будет интерпретировать литерал как"int" (или соответствующий тип со знаком, который может содержать значение) и не может быть приведен к типу без знака (поскольку C # неявно приводит тип к знаку без знака, а xunit пытается неявно привести к общему типу),MSTest разрешит это, интерпретируя оба объекта как «объектные» объекты, но выдаст ошибку, потому что, хотя значения совпадают, типы различаются.

То же самое обычно происходит и с примитивами:

ulong x = 0x7fffffff;
Assert.Equal(0x7fffffff, x);

IsЕсть ли что-нибудь, что я могу сделать, чтобы избежать неявного приведения (например: "Assert.Equal ((ulong) 0x7fffffff, x);")?Это сделало бы код ужасно раздутым из-за того, что ему приходилось приводить типы везде.

1 Ответ

0 голосов
/ 19 сентября 2018

Когда вы объявляете литерал, вы можете объявить тип, используя суффикс .Это позволяет вам указать тип литерала без приведения.

Так что, возможно, попробуйте это:

UInt240 x = 0x7fffffffUL;
Assert.Equal(0x7fffffffUL, x);
...