2017-09-03 37 views
0

我有以下方法:檢查在C#與通用bool值

void Test<T>(T Result) 

,我需要實現這樣的事情:

if Result is null, or T is a bool and that bool is false 

我試圖做類似

if (typeof(T) == typeof(bool) 
{ 
    if ((bool)Result == false) // doesn't work 
    if (Result as bool == false) // doesn't work 

如何在不創建兩種方法的情況下實現這一點?

+0

你所要求的稱爲模板專業化。在C#中最接近於此的是超載,請參閱我建議的重複答案。 – dlatikay

+0

爲您添加一個約束方法'測試(T結果)其中T:IComparable'使其* *具有可比性*。 'Result.CompareTo(true)== 0' –

+0

'if(someBool == false)'永遠無用。只要使用'if(!someBool)' – oerkelens

回答

2

,您可以嘗試強制轉換爲可空bool並對其進行測試:

public void Test<T>(T result) 
{ 
    var asBool = result as bool?; 
    if (!asBool.HasValue || !asBool.Value) 
    { 
     // do whatever 
    } 
} 

(我改變Resultresult,因爲它是一個參數)

+0

這個工程!謝謝! – Thomas

0

這裏的另一種解決方案,它蒙上通過objectTbool (你不能直接投Tbool):

if ((bool)(object)result == false) 
{ 
    // bool with value set to false 
} 

如果性能是一個問題,您可能還需要考慮對答案中提出的所有解決方案進行基準測試 - 請參見"Performance surprise with 「as」 and nullable types"

+0

性能不是問題,但感謝鏈接,這很有趣! – Thomas

0

您可以

if (EqualityComparer<T>.Default.Equals(result, default(T))) { 
    ... 
} 

測試booldefault(T)false,對於引用類型是null。對於所有其他類型,它是由設置爲0的所有位表示的值。即對於數字類型,它將是0