c# - 通用参数基类型 : "There is no implicit reference conversion from B to A"

标签 c# generics type-constraints

[Serializable]
public abstract class A
{
    public A()
    {

    }
}

[Serializable]
public class B : A
{
    public B() : base()
    {

    }
}

在扩展中:

public static T NextRecord<T>(this SqlDataReader reader) where T : A, new()
{
    // Do work
}

我这样称呼这个扩展:

B b = reader.NextRecord<B>();

但是,我得到这个异常:“没有从‘B’到‘A’的隐式引用转换。”

我做错了什么?

谢谢。

编辑

public static T NextRecord<T>(this SqlDataReader reader) where T : A, new()
{
    // Make sure we have been given a correct Type
    if (!typeof(T).BaseType.Equals(typeof(A)))
    {
        throw new Exception("Supplied Type is not derived from Type A");
    }

    if (reader.IsNull())
    {
        throw new ArgumentNullException("reader is null");
    }

    if (reader.HasRows)
    {
        if (reader.Read())
        {
            // Instance a object of the type, passing it the SqlDataReader so that it can populate itself   
            return Activator.CreateInstance(typeof(T), new object[] { reader }) as T;
        }
    }

    return null;
}

这是扩展的代码

最佳答案

虽然我通过将 where T : A 更改为 where T : class 解决了这个问题,但仍然存在问题。

我有第二个问题:

public class SomeOtherClass
{
    public static void Test(SomeClassBase obj)
    {

    }
}

public abstract class SomeClassBase
{
    public SomeClassBase()
    {
        SomeOtherClass.Test(this);
    }
}

public class SomeClass : SomeClassBase
{
    public SomeClass() : base()
    {

    }
}

我得到这个异常:

“'Namespace.SomeOtherClass.Test(Namespace.SomeClass)' 的最佳重载方法匹配有一些无效参数”

但是,从 ctor 中删除方法调用并在外部调用它会起作用,如下所示:

SomeClass s = new SomeClass(); SomeOtherClass.Test(s);

甚至将方法更改为:

public static void Test(SomeClass obj)
{

}

会失败:(

如果我将方法调用移动到派生类构造函数...

关于c# - 通用参数基类型 : "There is no implicit reference conversion from B to A",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10862690/

相关文章:

generics - 无法解析具有类型约束的简单 F# 运行时泛型函数

c# - 开放通用约束

c# - 如何在列表更改时拥有包含事件的列表

typescript - 如何在 typescript 中为通用参数添加 "newable"约束?

c# - 具有新类型约束的通用构造函数

Swift 的 pow() 函数不接受 Doubles 作为参数

c# - 从字符串调用带有可选参数的方法

c# - 闪烁的窗口不适用于 TabbedThumbnail(自定义任务栏预览)

c# - 多个 MDF 文件 VS 单个数据库(SQL Server)

c# - .NET泛型中重载运算符约束的解决方案