Строка равно не работает со строковыми числами - PullRequest
0 голосов
/ 31 января 2012

Как мои строки могут иметь разные хеш-коды, но одинаковое текстовое значение "16 777 216"?

Метод испытания не проходит:

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestStringEquals
{
  [TestClass]
  public class FormatterTests
  {
    [TestMethod]
    public void Double_Test_1()
    {
      Assert.AreEqual("16 777 216", FormatDoubleWithThousandSeparator(16777216, 0));
    }

    public string FormatDoubleWithThousandSeparator(double value, int digits)
    {
      double result = Math.Round((double)value, digits);

      System.Globalization.NumberFormatInfo nfi = (System.Globalization.NumberFormatInfo)System.Globalization.NumberFormatInfo.InvariantInfo.Clone();
      nfi.NumberGroupSeparator = " ";

      return result.ToString("###,###,###,###,###,###,##0.#####", nfi);
    }
  }
}

Ответы [ 4 ]

4 голосов
/ 31 января 2012

Возможно, результаты теста будут более полезными, если вы замените свое утверждение на:

Assert.AreEqual("16 777 216", numberToString);
3 голосов
/ 31 января 2012

Я провел этот модульный тест в Visual Studio 2010, и он прошел для меня.Это может быть связано с некоторыми настройками культуры на вашем компьютере или с тем, как оператор == ведет себя со строками.

отредактировано для ясности

2 голосов
/ 31 января 2012

Assert.IsTrue () принимает два аргумента типа Object .Оператор == для типов объектов проверяет равенство ссылок .Строки перегружают оператор ==, чтобы вместо этого проверять равенство значений, но когда вы передаете строки этой функции, вы фактически приводите их к объектам и заставляете использовать оператор объекта ==: он проверяет ваши строки на равенство ссылок, что может возвращать или не возвращать true в зависимости от того, интернированы ли строки.

Вместо этого используйте Assert.AreEqual() или
Assert.IsTrue("16 777 216".Equals(numberToString), "Expected 2^24").

0 голосов
/ 31 января 2012

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

Убедитесь, что это не тот случай, когда одна строка имеет непечатаемый символ, а другая - нет. Вы должны помнить, что строка является объектом. Таким образом, вам необходимо сравнить значение указанного объекта со значением другого объекта.

http://msdn.microsoft.com/en-us/library/system.string.equals.aspx
http://msdn.microsoft.com/en-us/library/1hkt4325.aspx

...