Подтвердить что ты не робот

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: Я нашел дубликат здесь и объяснение здесь

4b9b3361

Ответ 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'