我在啟用可為空的背景關系中運行我的專案,我希望簡化我的代碼,因為它是內部的,我知道傳入的參考是非空的。如果我使引數不可為空,IEqualityComparer 介面會發出警告。
class FileInfoComparer : IEqualityComparer<FileInfo>
{
// Round up timestamp to the next 2 seconds
const long interval = 20_000_000;
DateTime RoundUp(DateTime time) => time.AddTicks(interval - (time.Ticks - 1) % interval - 1);
public bool Equals(FileInfo? fi1, FileInfo? fi2)
{
return fi1.Name == fi2.Name &&
RoundUp(fi1.LastWriteTime) == RoundUp(fi2.LastWriteTime) && fi1.Length == fi2.Length;
}
public int GetHashCode(FileInfo fi)
{
return HashCode.Combine(fi.Name, RoundUp(fi.LastWriteTime), fi.Length);
}
}
就目前而言,每當我試圖使它們不可為空時,我都會在各種 fi1 和 fi2 參考下得到波浪線。我試過在地方添加各種屬性,如 [NotNull] 但沒有任何效果。我也試過這樣寫:
return fi1?.Name == fi2?.Name &&
RoundUp(fi1.LastWriteTime) == RoundUp(fi2.LastWriteTime) && i1.Length == fi2.Length;
但波浪線只是移動到其他地方。是否有任何空屬性,如 [DisallowNull] 等,我可以在正確的位置添加以洗掉警告?
uj5u.com熱心網友回復:
/// <remarks>
/// <see cref="Equals"/> rejects <see langword="null"/> values.
/// </remarks>
class FileInfoComparer : IEqualityComparer<FileInfo>
{
// Other parts as before
public bool Equals(FileInfo? fi1, FileInfo? fi2)
{
if (fi1 is null)
{
throw new ArgumentNullException(nameof(fi1));
}
if (fi2 is null)
{
throw new ArgumentNullException(nameof(fi2));
}
return fi1.Name == fi2.Name &&
RoundUp(fi1.LastWriteTime) == RoundUp(fi2.LastWriteTime) && fi1.Length == fi2.Length;
}
// GetHashCode as before
}
如果需要,可以將引數驗證轉換為一個方法,該方法接受一個引數并在它為空時拋出。
使用空原諒運算子的替代方法:
/// <remarks>
/// <see cref="Equals"/> rejects <see langword="null"/> values.
/// </remarks>
class FileInfoComparer : IEqualityComparer<FileInfo>
{
// Other parts as before
public bool Equals(FileInfo? fi1, FileInfo? fi2)
{
return fi1!.Name == fi2!.Name &&
RoundUp(fi1.LastWriteTime) == RoundUp(fi2.LastWriteTime) && fi1.Length == fi2.Length;
}
// GetHashCode as before
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/360399.html
