重载方法以支持引用类型和可空类型

Jos*_*ant 2 c# generics extension-methods nullable

我有一个扩展方法,我想重载,所以它可以处理引用类型和可空值的类型.但是,当我尝试这样做时,我得到"已经宣布具有相同签名的成员".C#不能where在我的泛型方法上使用限定符来区分它们吗?使这项工作变得明显的方法是给每个方法一个不同的名称,但这对我来说似乎不是一个非常优雅的解决方案.这项工作的最佳方法是什么?

例:

public static T Coalesce<T>(this SqlDataReader reader, string property) where T : class
{
    return reader.IsDBNull(reader.GetOrdinal(property))
               ? null
               : (T) reader[property];
}

public static T? Coalesce<T>(this SqlDataReader reader, string property) where T : struct
{
    return reader.IsDBNull(reader.GetOrdinal(property))
               ? null
               : (T?)reader[property];
}

// Usage
var id = reader.Coalesce<System.Guid?>("OptionalID");
Run Code Online (Sandbox Code Playgroud)

Sam*_*ell 7

如果SqlDataReader.Item[string]属性类型是,则此方法有效object.

public static T Coalesce<T>(this SqlDataReader reader, string property)
{
    return reader.IsDBNull(reader.GetOrdinal(property))
               ? default(T)
               : (T) reader[property];
}
Run Code Online (Sandbox Code Playgroud)