为什么接受引用类型的泛型方法不接受可空类型作为参数?

dev*_*ton 4 .net c# generics nullable value-type

乍看上去,

public static class Conversion
{
    public static T Read<T>(object value) where T :class
    {
        if (value is DBNull) return null;
        if (value is null) return null;

        if (value is Enum) return (T)Enum.Parse(typeof(T), value.ToString(), true);
        return (T)Convert.ChangeType(value, typeof(T));
    }
}
Run Code Online (Sandbox Code Playgroud)

调用一个Read<T>函数

var myVariable = Conversion.Read<bool?>(Row[nameof(IsFetchNextRecordAfterDelete)]);
Run Code Online (Sandbox Code Playgroud)

错误 CS0452 类型“布尔?” 必须是引用类型才能将其用作泛型类型或方法“Conversion.Read(object)”中的参数“T”

想知道为什么? 布尔?可以为空,这意味着它是一个引用类型,并且声明了泛型方法where T : class

Joh*_*nne 6

“布尔?” 是引用类型。它是一个可为空的类型。请参阅可空值类型(C# 参考) 底层类型是一个结构体(这是一个值类型)。