Assert.AreEqual терпит неудачу для int и ulong, но не долго и uint
Ну, я надеюсь, что мой процессор не будет гореть, потому что:
[TestMethod]
public void tenEqualten()
{
Int64 a = 10;
UInt32 b = 10;
Assert.AreEqual(a, b);
}
работает просто отлично, но это:
[TestMethod]
public void tenNotEqualten()
{
Int32 a = 10;
UInt64 b = 10;
Assert.AreEqual(a, b);
}
терпит неудачу.
У вас есть такие же результаты, или это только я?
Если да, то какие идеи, почему?
Если это известная проблема для .Net 4.5, чем жалко спама, но я не мог найти это как ошибку.
edit: Я нашел дубликат здесь и объяснение здесь
Ответы
Ответ 1
В первом методе вы вызываете Assert.AreEqual<T>(T expected, T actual)
, где T
имеет тип Int64
, это связано с тем, что UInt32 неявно отсылается к Int64. Это тот же эффект, что и вы
[TestMethod]
public void tenEqualten()
{
Int64 a = 10;
UInt32 b = 10;
Assert.AreEqual(a, (Int64)b);
}
Вот почему проходит первая версия.
Во второй версии вы вызываете Assert.AreEqual(object expected, object actual)
, который терпит неудачу, потому что они разные, а не "равные".
Вы можете сделать свою первую версию такой, как ваша вторая версия, поместив два числа внутри object
, это позволит вам использовать ту же самую перегрузку Assert.
[TestMethod]
public void tenEqualten()
{
Int64 a = 10;
UInt32 b = 10;
object c = a;
object d = b;
Assert.AreEqual(c, d);
}
Этот метод потерпит неудачу точно так же, как ваш метод tenNotEqualten
завершится с ошибкой.
Ответ 2
Посмотрите расширяющуюся таблицу.
Integer -> Integer , Long, Decimal, Single, Double
UInteger -> UInteger , Long, ULong, Decimal, Single, Double
Как это относится к вашему коду?
Когда вы сравниваете long
(Int64
) с uint
(UInt32
), uint
может соответствовать long
, поэтому здесь нет проблем.
Однако, когда вы сравниваете int
(Int32
) с ulong
(UInt64
), вы можете видеть, что доступное расширение не доступно: они не подходят друг другу.
Вы можете увидеть это более четко, просто взглянув на разрешение метода, сделанное intellisense:
![enter image description here]()
![enter image description here]()
И наконец:
object c = (int) 10;
object d = (ulong) 10;
Console.WriteLine (c == d);
даст false
Ответ 3
UInt32
может быть отличен до Int64
, но UInt64
нельзя отнести к Int32
, поскольку он не подходит.
Вы получите ошибку компиляции при проверке c == d
в приведенном ниже примере.
Int64 a = 10;
UInt32 b = 10;
Console.WriteLine(a == b);
Int32 c = 10;
UInt64 d = 10;
Console.WriteLine(c == d);
Ответ 4
Используйте метод System.Convert.ToUInt64 для принудительного преобразования из Int32:
[TestMethod]
public void tenNotEqualten()
{
Int32 a = 10;
UInt64 b = 10;
Assert.AreEqual(Convert.ToUInt64(a), b);
}
Кроме того, рекомендуется использовать общие методы Assert, чтобы указать общий параметр, чтобы избежать проблем с преобразованием. Ниже приведена более читаемая ошибка времени компиляции:
Assert.AreEqual<UInt64>(a, b);
Наилучшее перегруженное соответствие метода для "Microsoft.VisualStudio.TestTools.UnitTesting.Assert.AreEqual(ulong, ulong)" содержит некоторые недопустимые аргументы
Аргумент 1: не может преобразовать из 'int' в 'ulong'