[英]Can pass null to generic function when type is a value type
目前,我僅限於通過.NET 4.0使用VB.NET,並且在進行LINQ查詢時想使用前置功能,這是我創建的功能:
<Extension>
Public Iterator Function Prepend(Of TSource)(source As IEnumerable(Of TSource), item As TSource) As IEnumerable(Of TSource)
If source Is Nothing Then Throw New ArgumentNullException(NameOf(source))
Yield item
For Each sourceItem In source
Yield sourceItem
Next
End Function
但是有趣的是,當您將函數鍵入值類型時,您傳遞空引用,例如Integer:
Dim arr = {1, 2, 3}
Dim arr2 = arr.Prepend(Nothing).ToArray()
這將生成一個包含以下內容的數組:0、1、2、3。當轉換為等效的C#並在.NET Core 2.1項目中使用時,我正確地收到了一個編譯器錯誤,告訴我無法在null和整數之間進行轉換。
有沒有辦法告訴VB.NET,我不希望這種事情發生並在編譯時導致錯誤,還是我需要訴諸運行時類型檢查?
VB中沒有Nothing
與C#中的null
。 更好的等效項是default
,因為它表示其類型的默認值。 正如您所注意到的,引用類型的行為是相同的(默認值是空引用),但是值類型卻有很大不同。
由於這是該語言設計的一部分,因此無法將其關閉。
另請參閱Anthony Green的文章: https : //anthonydgreen.net/2019/02/12/exhausting-list-of-differences-between-vb-net-c/#46
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.