我应该怎么做“值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警告说, expected
和actual
可能是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
)。