2010-07-20 77 views
9

我試圖創建一個簡單的卡箍(這樣我就可以綁定的東西可比價值...主要用於數字類型,如int,double等)與IComparable一起使用的可爲空的泛型類型。可能嗎?

的問題是,如果我做了以下我收到一個錯誤,但是IComparable的CompareTo應該能夠處理空值。
Quote:「根據定義,任何對象比較大於null,並且兩個空引用比較彼此相等。」

public static T Clamp<T>(this T value, T min, T max) 
    where T : IComparable<T> 
{ 
    if (value.CompareTo(max) > 0) 
     return max; 

    if (value.CompareTo(min) < 0) 
     return min; 

    return value; 
} 



private Int32? _zip; 
public Int32? Zip 
{ 
    get 
    { 
     return _zip; 
    } 
    set 
    { 
     _zip = value.Clamp<Int32?>(0, 99999); 
    } 
} 

回答

7

記住,Int32?Nullable<Int32>的簡寫。由於Nullable<T>沒有實現IComparable<T>,所以你的代碼,結構化,不會編譯。

你可以,但是,重載方法:

public static T? Clamp<T>(this T? value, T? min, T? max) 
    where T : struct, IComparable<T> 
{ 
    // your logic... 
} 

當然,如果你在使用可空類型的工作計劃,你必須定義你將如何鉗制null值...

如果你實際上並不需要夾緊null值,它可能是簡單的空只是第一次檢查你的財產的getter:

public Int32? Zip 
{ 
    ... 
    set 
    { 
     _zip = value == null ? value : value.Value.Clamp<Int32>(0,99999); 
    } 

或者更好的是,讓額外的超負荷Clamp的執行工作的一部分...

+0

我不知道爲什麼我沒有做(價值== null)?值:value.Clamp (0,99999);開始。我想我只是試圖強制Clamp自動執行此操作。但是,是的,它實際上是更有意義的,因爲它是夾緊的,所以不要將它歸零。 – 2010-07-20 22:31:42

+0

現在它不適用於字符串))) – 2018-02-20 10:31:10

12

正如@LBushkin可空< T>或T說的嗎?沒有實現IComparable接口。給定的解決方案是可以的,但是我喜歡在之後的專門類中使用可空的比較邏輯,也可以用於比較任何可空類型。

例如,你可以創建一個通用的可空類型的比較器類是這樣的:

public class NullableComparer<T> : IComparer<Nullable<T>> 
     where T : struct, IComparable<T> 
{ 

    public int Compare(Nullable<T> x, Nullable<T> y) 
    { 
     //Compare nulls acording MSDN specification 

     //Two nulls are equal 
     if (!x.HasValue && !y.HasValue) 
      return 0; 

     //Any object is greater than null 
     if (x.HasValue && !y.HasValue) 
      return 1; 

     if (y.HasValue && !x.HasValue) 
      return -1; 

     //Otherwise compare the two values 
     return x.Value.CompareTo(y.Value); 
    } 

} 

在這種情況下,你會使用這個類是這樣的:

public static T? Clamp<T>(this T? value, T? min, T? max) 
    where T : struct 
{ 
    var comparer = new NullableComparer<T>(); 

    if (comparer.Compare(value, max) > 0) 
     return max; 

    if (comparer.Compare(value, min) < 0) 
     return min; 

    return value; 
} 

的Handy在你的助手節約圖書館。

希望它有幫助!

相關問題