[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/