簡體   English   中英

泛型類型的函數:返回一個不可為空的值

[英]Generic typed function: return a non-nullable value

我寫了這個瑣碎的實用函數:

public static T isNull<T>(T? v, T d)
{
    return v == null ? d : v.Value;
}

目的是避免令人討厭的任務,例如檢查成員是否為空,這在讀取linq記錄集時很常見。 問題是它引發了以下錯誤:

為了在通用類型或方法“ System.Nullable <T>”中將其用作參數“ T”,類型“ T”必須為非空值類型

該錯誤似乎合法,無論如何我希望我可以做這樣的事情:

int? myField = record.myField;
int  myValue = isNull(myField, 0);

代替:

int? myField = record.myField;
int  myValue = myField == null ? 0 : myField.Value;

我覺得我缺少一些C#基本知識。 是否存在完成任務的方法?

通用約束可用於通用函數,以將允許使用的類型限制為某些子集,這為您如何在方法或類中使用這些類型提供了可能性。

在這種情況下,你可以申請成為制約T ,是限制了一個struct ,以解決您的具體編譯器錯誤。

public static T IsNull<T>(T? v, T d) where T : struct
{
    return v == null ? d : v.Value;
}

但是,另一個答案確實正確地指出您可以選擇使用空合並運算符?? 在這種特殊情況下。

這稱為空合並,並且有一個內置的運算符可以做到這一點:

int myValue = record.myField ?? 0

盡管其他答案都不錯,但是大概您希望編寫您的方法,使其可以同時用於引用和值類型。 您可以通過兩個都有通用約束的重載來實現。

public static T IsNull<T>(T v, T d) where T : class
{
    return v ?? d;
}

public static T IsNull<T>(T? v, T d) where T : struct
{
    return v.HasValue ? v.Value : d;
}

注意:使用非Nullable<T>以外的其他值類型調用IsNull仍不會編譯。 例如

string myString = ...
Console.WriteLine(IsNull(myString, "foo"))            // works

object myObject = ...
Console.WriteLine(IsNull(myMyObject, new object()))   // works

DateTime? myDateTime = ...
Console.WriteLine(IsNull(myDateTme, DateTme.Now))     // works

int? myInt1 = ...
Console.WriteLine(IsNull(myInt1, DateTme.Now))        // works

int myInt2 = ...
Console.WriteLine(IsNull(myInt2, DateTme.Now))        // <-- compiler error

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM