泛型和返回类对象

时间:2011-10-02 12:52:48

标签: c# generics

我正在尝试使用泛型返回类的对象。

这是通用类

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()方法中缺少一些东西;只是无法想象这一点。有人可以帮我吗?

感谢您的时间......

2 个答案:

答案 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