[英]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.