318. Why Nullable{T} struct isn't true

עבר הכרנו את הטיפוס Nullable (טיפ מספר 35).

ראינו בטיפ מספר 31 את הConstraintים המיוחדים

1
2
where T : struct
where T : class

מה שמעניין הוא שאם נכתוב קוד כזה:

1
2
3
public static void MyGenericMethod<T>()
{
}

לא נוכל להעביר אליו טיפוס שהוא Nullable אם אחד הConstraintים המיוחדים מלמעלה נמצא.


מה קורה כאן?

הרי Nullable הוא struct בעצמו: אם נסתכל בMetadata שלו נראה:

1
public struct Nullable<T> where T : struct

ובכן, אם אכן יכולנו להעביר למתודה הזאת

1
2
3
public static void MyGenericMethod<T>() where T : struct
{
}

טיפוס שהוא Nullable, זה היה אומר שNullable מקיים את התנאי where T : struct. ואז היינו יכולים לכתוב:

1
Nullable<Nullable<int>> myNullableNullable;

אבל מאחר ואין לכך משמעות, החליטו ליצור פאץ’ ולא לאפשר לConstraint לקבל את Nullable. אם תקראו בMSDN תראו שהתיאור הוא Non nullable value type.

סופ"ש לא Nullable טוב!

שתף