通用参数基类型:“没有从B到A的隐式引用转换”

时间:2012-06-02 13:32:02

标签: 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;
}

这是扩展程序的代码

1 个答案:

答案 0 :(得分:0)

仍有问题,虽然我通过改变T:A到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()
    {

    }
}

我得到了这个例外:

&#34;最佳重载方法匹配&#39; Namespace.SomeOtherClass.Test(Namespace.SomeClass)&#39;有一些无效的参数&#34;

但是,从ctor中删除mothod调用并在外面调用它将会起作用,如下所示:

SomeClass s = new SomeClass(); SomeOtherClass.Test(一个或多个);

甚至将方法更改为:

public static void Test(SomeClass obj)
{

}

会失败:(

如果我将方法调用移动到派生类ctor ...