我正在尝试使用泛型返回类的对象。
这是通用类
public class ClientBase <S>
{
protected S CreateObject()
{
return default(S) ;
}
}
这就是我尝试使用它的方式......
public class ClientUser : ClientBase <SomeClass>
{
public void call()
{
var client = this.CreateObject();
client.SomeClassMethod();
}
}
当我在客户端对象中获得SomeClassMethod()
时,在运行代码时,它会在行中显示错误:
client.SomeClassMethod();
错误是'对象引用未设置为对象的实例'。我知道泛型类ClientBase的CreateObject()方法中缺少一些东西;只是无法想象这一点。有人可以帮我吗?
感谢您的时间......
答案 0 :(得分:3)
default(S)
其中S
是引用类型为null。在您的情况下,default(SomeClass)
返回null。当您尝试在空引用上调用方法时,就是在您获得异常时。
您是否尝试返回SomeClass
的默认实例?您可能希望在通用类中使用new()
约束和return new S()
,如下所示:
public class ClientBase<S> where S : new()
{
protected S CreateObject()
{
return new S();
}
}
如果S
需要是参考类型,您还可以将其约束为class
:
public class ClientBase<S> where S : class, new()
{
protected S CreateObject()
{
return new S();
}
}
答案 1 :(得分:2)
了解default(T)
的作用:http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx
在你的情况下,default(S)
将返回null(因为它是一个类) - 这不是该类的实例。
您需要在派生类中调用new S()
或其他S
构造函数或覆盖CreateObject
。