C# 为什么AreEquals说两个值不正确,而其中一个是双引号?

C# 为什么AreEquals说两个值不正确,而其中一个是双引号?,c#,webdriver,assert,C#,Webdriver,Assert,我在我的WebDriver脚本中进行了以下检查,我从页面中提取了一个日期字段 IWebElement crInfo = driver.FindElement(By.Id("crInfo")); string copyDate = crInfo.Text; // From the converted string now pulling out the year by index and length string copyYear = copyDate.Substring(2, 4); // G

我在我的WebDriver脚本中进行了以下检查,我从页面中提取了一个日期字段

IWebElement crInfo = driver.FindElement(By.Id("crInfo"));
string copyDate = crInfo.Text;
// From the converted string now pulling out the year by index and length
string copyYear = copyDate.Substring(2, 4);
// Get the current year
int nowYear = DateTime.Today.Year;
// Converting the year
nowYear.ToString().Trim();
// Make the comparison to be sure the copyright is using the current date
Assert.AreEqual(copyYear,nowYear);
正如在代码片段中所指出的,我试图做的是确认页面中显示的日期是当前年份,这只是一个web前端检查,以确保放置的函数返回正确的值。当我运行此命令时,我在NUnit控制台中看到的是:

错误:预计为“2012” 但事实是:2012年

我真的不明白两者之间的区别,引用的值是字符串吗?我在脚本中添加了转换以确保它们是相同的类型,并添加了修剪以防出现空白


如果我想让这项工作顺利进行,我没有做什么来让断言通过?

看看您的类型和断言:

string copyYear = ...
int nowYear = ...
Assert.AreEqual(copyYear,nowYear);
不管值是什么,这个断言永远不会通过。字符串永远不等于C#中的整数。虽然有一些语言在这种情况下执行类型强制,但C#不是其中之一

还要注意,这一行是无用的:

nowYear.ToString().Trim();
字符串在.NET中是不可变的-像
Trim()
这样的方法不会更改调用它们的字符串-它们返回一个新字符串。你忽略了返回值。。。不管怎么说,你是在一个字符串上调用它,然后你会完全忽略它。您可以使用:

string nowYearAsString = nowYear.ToString().Trim();
Assert.AreEqual(copyYear, nowYearAsString);
。。。或者您可以先将
copyYear
解析为
int
,然后进行比较:

int copyYearAsInt = int.Parse(copyYear);
Assert.AreEqual(copyYearAsInt, nowYear);

查看您的类型和断言:

string copyYear = ...
int nowYear = ...
Assert.AreEqual(copyYear,nowYear);
不管值是什么,这个断言永远不会通过。字符串永远不等于C#中的整数。虽然有一些语言在这种情况下执行类型强制,但C#不是其中之一

还要注意,这一行是无用的:

nowYear.ToString().Trim();
字符串在.NET中是不可变的-像
Trim()
这样的方法不会更改调用它们的字符串-它们返回一个新字符串。你忽略了返回值。。。不管怎么说,你是在一个字符串上调用它,然后你会完全忽略它。您可以使用:

string nowYearAsString = nowYear.ToString().Trim();
Assert.AreEqual(copyYear, nowYearAsString);
。。。或者您可以先将
copyYear
解析为
int
,然后进行比较:

int copyYearAsInt = int.Parse(copyYear);
Assert.AreEqual(copyYearAsInt, nowYear);
copyYear是一个字符串。 现在年份是整数。你的行

nowYear.ToString().Trim();
今年不会以任何方式改变。您要作为此行结果进行比较的字符串未指定给任何变量。你需要做什么

string nowYearStr =  nowYear.ToString().Trim();
然后将nowYearStr与copyYear进行比较。

copyYear是一个字符串。 现在年份是整数。你的行

nowYear.ToString().Trim();
今年不会以任何方式改变。您要作为此行结果进行比较的字符串未指定给任何变量。你需要做什么

string nowYearStr =  nowYear.ToString().Trim();


然后将nowYearStr与copyYear进行比较。

因为一个字符串到一个IntOne是一个字符串,另一个是一个int?您需要转换要在字符串中表示的日期。使用.ToString()将日期转换为字符串。表示可能需要的是
字符串strNowYear=nowYear.ToString().Trim()
而不是您的
nowYear.ToString().Trim()
,后者实际上根本不起什么作用。。然后在最后比较copyYear和strNowYear。谢谢!这就是我转变信仰的全部问题。我希望我不必重新分配nowYear,只需按原样使用它,因为一个字符串到一个IntOne是一个字符串,另一个是一个int?您需要将日期转换为字符串中表示的日期。使用.ToString()将日期转换为字符串。表示您可能需要的是
String strNowYear=nowYear.ToString().Trim()
而不是您的
nowYear.ToString().Trim()
,后者实际上根本不起什么作用。。然后在最后比较copyYear和strNowYear。谢谢!这就是我转变信仰的全部问题。我希望今年我不必重新分配,只需按原样使用它……我认为它会改变值,所以我不需要重新分配它。对我来说,这是一个糟糕的举动……就是这样。谢谢@迈克尔夫:它怎么能根据字符串操作改变
nowYear
(这是一个
int
)的值呢?@JonSkeet.Net不是我的主要编码语言啊……我以为它会改变值,所以我不需要重新分配它。对我来说,这是一个糟糕的举动……就是这样。谢谢@MichaelF:它怎么能根据字符串操作改变
nowYear
(这是一种
int
)的值?@jonsket.Net不是我的主要编码语言这是我在.Net中没有得到的“字符串在.Net中是不可变的”因为这不是我的主要编码语言,它的某些方面我还不太习惯。谢谢你的深入解释,我很感激。这是你在这方面的胜利,因为你花了时间向我解释。这是我在.NET“字符串在.NET中是不可变的”中没有得到的,因为这不是我的主要编码语言。它的某些方面我还不太习惯。谢谢你的深刻解释,我很感激。因为你花了时间向我解释了这件事,所以我给了你胜利。