2016-07-21 4 views
-1

私は次のクラスを持っている:汎用はNullableにできますか?

public class RangeFilter<T> : IFilter<T> where T : IConvertible, IComparable { 

    public T Maximum { get; private set; } 
    public T Minimum { get; private set; } 

    public RangeFilter(T maximum) { 
    Minimum = null; 
    Maximum = maximum; 
    } 

} 

Tは私が唯一の最大値を渡すと、私は次のことを得ることを行うとき、私はnullにする最小の必要があるが... INT、ダブル、することができエラー:

Cannot convert null to type parameter 'T' because it could be a non-nullable value type. 
Consider using 'default(T)' instead.  

私はデフォルトを使用したくない理由(T)私は、最小が定義され、デフォルト(T)が最小の有効な値である場合には、後にチェックする必要があるためです。

答えて

4

限りTはあなたが何ができるかnullに値を設定することはできませんNULL可能でないと...あなたが作成している

public class RangeFilter<T> : IFilter<T> 
    where T : struct, IConvertible, IComparable 
{ 

    public T? Maximum { get; private set; } 
    public T? Minimum { get; private set; } 

    public RangeFilter(T maximum) 
    { 
     Minimum = null; 
     Maximum = maximum; 
    } 

} 
+0

これは私が私の答えを削除した後に私が向かうところです。 'T'が数値であることを示唆しているので、この問題に関係なく' struct'制約が適切であったと思います。 – spender

0

クラスは、タイプあなた本来、NULL可能、このようなものですパスできないかもしれません。渡すタイプをT(doc)として制限するか、両方のシナリオをサポートするように割り当てを変更することができます。

1

問題は明らかにコンパイルエラーによって記述されているが、それはここで完全に使用不可能ですので、あなたが(T場合は参照型、またはNullable<U>何であるか?)幸いなことに、あなたはFunctional.Maybeある代替を試すことができNullable<T>を使用することはできません。値型と参照型の両方で機能します。

あなたが代わりに魔法の値を使用してのフラグを使用すると、

public HasMinimum {get; private set;} 

private T _min; 
public T Minimum 
{ 
    get 
    { 
     if(!HasMinimum) 
      throw new InvalidOperationException("Minimum not set"); 
     return _min; 
    } 
    private set 
    { 
     HasMinimum = true; 
     _min = value; 
    } 
} 

を最小に設定されたか何かが設定されていないか、いない場合は、あなたのコンストラクタにだけ最小限のプロパティを設定しないでください知っているように作ることができる

0

public RangeFilter(T maximum) 
{ 
     Maximum = maximum; 
} 
0

intdoubleはNULL可能なタイプではないので、彼らはそれらに割り当てられた値を持っている必要がありますし、あなたがそのエラーを得ている理由です。あなたの周りの仕事としてT?またはNullable<T>を使用することができ、けれども:

int? t = null; // t is nullable, so it works 

また、あなたはminまたはmaxのデフォルト値を持っている場合は、あなたのケースでも有用で、ネストされたNullable<T>.GetValueOrDefaultを使用することができます。

関連する問題