我应该怎么做“值types与'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())); } 

Resharper警告说, expectedactual可能是ValueType对象。

例如,TExpected是DateTime
   预计== null; //但DateTime是一个结构。

将ValueType与null进行比较时的规则是什么?我应该如何编写方法来解决这个问题,而不是通过添加类约束来限制generics参数?

不要更改代码 – 只要忽略警告。 如果types参数是一个不可为空的值types,比较将总是失败,它会一直调用ToString() 。 我不知道它是否真的被抛出,但我不会感到惊讶…这听起来不像性能严重的代码:)

我个人会把这个警告留在“上”,但在这个特殊情况下可以忽略它 – 可能会有一个评论。

当我重新实现LINQ to Objects时,我想我几次遇到同样的警告。

将ValueType与null进行比较时的规则是什么?我应该如何编写方法来解决这个问题,而不是通过添加类约束来限制generics参数?

如果你不知道他们会是参考types,那么你可以说

 private void AddMatchFailure<TExpected, TActual>( string failureName, TExpected expected, TActual actual ) { _matchFailures.Add( String.Format(MatchFailureFormat, failureName, IsDefault<TExpected>(expected) ? DefaultStringForType<TExpected>() : expected.ToString(), IsDefault<TActual>(actual) ? DefaultStringForType<TActual>() : actual.ToString() ); } private bool IsDefault<T>(T value) { if(typeof(T).IsValueType) { return default(T).Equals(value); } else { return Object.Equals(null, value); } } private string DefaultStringForType<T>() { if(typeof(T).IsValueType) { return default(T).ToString(); } else { return "null"; } } 

我正在使用这样的东西来检查genericstypes为null:

 if (Equals(result, Default(T))) 
 private void AddMatchFailure<TExpected, TActual>(string failureName, TExpected expected, TActual actual) { _matchFailures.Add( String.Format(MatchFailureFormat, failureName, (expected == default(TExpected)) ? "null" : expected.ToString(), (actual == default(TActual)) ? "null" : actual.ToString())); } 

应该这样做。

default(T)给出该types的默认值,对于引用types是空的 – 对于其他依赖的引用types。 (例如,枚举它等于(enumType)0 )。