相关疑难解决方法(0)

我应该怎么做"可能比较值类型与'null'"?

在为自定义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警告expectedactual可能是ValueType物体.

e.g. TExpected is DateTime
   expected == null;//  but DateTime is a struct.

将ValueType与null进行比较时有哪些规则?如何在不限制通用参数的情况下通过添加类约束来编写方法来解决这个问题?

c#

71
推荐指数
2
解决办法
1万
查看次数

如何将泛型类型与其默认值进行比较?

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'类型的操作数

我该怎么做呢?

.net c# generics

46
推荐指数
0
解决办法
7028
查看次数

将泛型与null相比较,可以是值或引用类型?

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).虽然我想知道:

  • 有没有更标准的方法来处理这种情况?
  • 有没有可能出现这个问题?
  • 当我打电话并传递值类型时,真正发生了什么?

c# generics null value-type null-check

41
推荐指数
2
解决办法
4837
查看次数

为什么在比较之前将Assert.AreEqual()强制转换为对象?

我正在编写一些单元测试,以下断言失败:

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()方法是铸造既expectedactualobject强制使用基本的Equals()方法,而不是我写的超载Episode类.基本方法只是检查引用是否相同,它们不是.

我有两个问题:

  1. 我的解释是否正确,还是我错过了什么?
  2. 为什么框架要强制使用object.Equals()而不是该方法的重载?

如果它是相关的,这是我的方法:

public bool Equals(Episode other)
{
    return Number == other.Number &&
           CaseNote.Equals(other.CaseNote) &&
           Patient.Equals(other.Patient);
}
Run Code Online (Sandbox Code Playgroud)

.net c# unit-testing assert

11
推荐指数
1
解决办法
2189
查看次数

标签 统计

c# ×4

.net ×2

generics ×2

assert ×1

null ×1

null-check ×1

unit-testing ×1

value-type ×1