簡體   English   中英

鑄造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。

您可以使用簡單的控制台應用程序檢查TGetType() 如果Tint ,則返回類型將為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.

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