![](/img/trans.png)
[英]Why can I test a generic for null when it may not be nullable or may not be an object?
[英]Casting object? to a generic type that may or may not be nullable
我正在嘗試將項目轉換為使用可為空的引用類型,但遇到了問題。 在我的項目中,我有一個地方可以獲得object?
在將其添加到集合之前,需要將其轉換為泛型類型T
類型T
可以是任何東西; 可空引用類型、不可空引用類型或值類型。 這在編譯時是未知的。
所以,假設我有以下代碼(玩具示例):
static T Convert<T>(object? value)
{
return (T)value;
}
這會導致編譯器抱怨 value 可能是 null,而 function 的返回可能是 null。 這很公平,因為如果T
不可為空且值為null
,則不允許這樣做。 我想也許這會起作用:
static T Convert<T>(object? value)
{
if (value == null)
return default;
else
return (T)value;
}
但這有同樣的問題:如果T
是一個不可為空的引用類型, default
仍然是null
,這仍然違反了約束。
使 function 返回T?
不是解決方案,因為在值類型的情況下,我不想使用Nullable<T>
。
如果value
null
,我考慮過拋出異常,但如果T
可以為空,我想允許 null 。 所以我只想在T
不可為空的情況下拋出它,並且在 C# 中似乎不可能實現這種通用專業化。
這里的上下文是我正在使用TypeConverter
,不幸的是,轉換結果允許返回null
。
有沒有好辦法來處理這種情況?
如果您使用 C# 9.0 或更高版本,則可以使用T?
無需求助於Nullable<T>
。 對於不可為空的上下文中的 generics,有一組特殊的規則,詳見此處。
如果 T 的類型參數是值類型,T? 引用相同的值類型 T。例如,如果 T 是 int,則 T? 也是一個int。
您可以使用簡單的控制台應用程序檢查T
的GetType()
。 如果T
是int
,則返回類型將為System.Int32
,而不是Nullable<System.Int32>
。
#nullable enable
using System;
public class Program
{
public static void Main()
{
var result = Convert<int>(null);
Console.WriteLine(result); // Prints: 0
Console.WriteLine(result.GetType().FullName); // Prints: System.Int32
}
static T? Convert<T>(object? value)
{
if (value is null)
return default(T);
return (T)value;
}
}
C#此處為操場示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.