在为自定义NUnit约束编写此方法时.
private void AddMatchFailure<TExpected, TActual>(string failureName, TExpected expected, TActual actual)
{
_matchFailures.Add(
String.Format(MatchFailureFormat, failureName,
(expected == null) ? "null" : expected.ToString(),
(actual == null) ? "null" : actual.ToString()));
}
Run Code Online (Sandbox Code Playgroud)
Resharper警告expected并actual可能是ValueType物体.
e.g. TExpected is DateTime expected == null;// but DateTime is a struct.
将ValueType与null进行比较时有哪些规则?如何在不限制通用参数的情况下通过添加类约束来编写方法来解决这个问题?
void Get<T>(Action<T> createObject)
{
T obj = createObject();
if(obj == default(T))
return obj;
// .. do a bunch of stuff
return obj;
}
Run Code Online (Sandbox Code Playgroud)
编译器错误:运算符'=='不能应用于'T'和'T'类型的操作数
我该怎么做呢?
public void DoFoo<T>(T foo) where T : ISomeInterface<T>
{
//possible compare of value type with 'null'.
if (foo == null) throw new ArgumentNullException("foo");
}
Run Code Online (Sandbox Code Playgroud)
我故意只检查null,因为我不想限制a ValueType等于它default(T).我的代码以这种方式编译和工作(ReSharper抱怨,但不是CodeAnalysis).虽然我想知道:
我正在编写一些单元测试,以下断言失败:
Assert.AreEqual(expected.Episode, actual.Episode);
Run Code Online (Sandbox Code Playgroud)
如果我改为调用它,它会成功:
Assert.IsTrue(expected.Episode.Equals(actual.Episode));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我假设Assert.AreEqual()最终调用Equals()它所给出的类型的方法Episode.Equals().
但是,在Microsoft.VisualStudio.TestTools.UnitTesting.Assert的封面下,我发现了以下代码(由ReSharper反编译):
public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
if (object.Equals((object)expected, (object)actual))
return;
Assert.HandleFail...
}
Run Code Online (Sandbox Code Playgroud)
这意味着我的AreEqual()方法是铸造既expected与actual以object强制使用基本的Equals()方法,而不是我写的超载Episode类.基本方法只是检查引用是否相同,它们不是.
我有两个问题:
如果它是相关的,这是我的方法:
public bool Equals(Episode other)
{
return Number == other.Number &&
CaseNote.Equals(other.CaseNote) &&
Patient.Equals(other.Patient);
}
Run Code Online (Sandbox Code Playgroud)