2

这不起作用:

public interface IServerFuncs
{
    Table<T> getTable<T>() where T : MasterClass;
    //*cut* other stuff here
}

public class DefaultFuncs<T> : IServerFuncs where T : MasterClass
{
    Table<T> table;

    public DefaultFuncs(Table<T> table)
    {
        this.table = table;
    }

    public Table<T> getTable()
    {
        return table;
    }
}

它说DefaultFuncs<T>' does not implement interface member 'IServerFuncs.getTable<T>()'

但我也不能这样做:

public Table<T> getTable<T>() where T:MasterClass
{
    return table;
}

它说Error: Cannot implicitly convert type 'MySQLCache.Table<T>。我猜方法中的 T 会与之发生冲突,DefaultFuncs<T>所以我尝试了:

public Table<T2> getTable<T2>() where T2:MasterClass
{
    return table;
}

但它给出了另一个错误:Error Cannot implicitly convert type 'Table<T>' to 'Table<T2>'

我需要在不向IServerFuncs( IServerFuncs<T>) 添加泛型类型的情况下使其正常工作。有什么想法吗?

4

2 回答 2

1

我认为如果不向界面添加模板修饰符就不能这样做,否则你可以这样做:

public class MC1 : MasterClass
{
}

public class MC2 : MasterClass
{
}

IServerFuncs df = new DefaultFuncs<MC1>(new Table<MC1>());
Table<MC2> table = df.getTable<MC2>();   // obviously not correct.

基本上,为了保证接口和实现使用相同的类型,您需要在接口定义中添加限定符:

public interface IServerFuncs<T> where T : MasterClass
{
    Table<T> getTable();
    //*cut* other stuff here
}

public class DefaultFuncs<T> : IServerFuncs<T> where T : MasterClass
{
    Table<T> table;

    public DefaultFuncs(Table<T> table)
    {
        this.table = table;
    }

    public Table<T> getTable()
    {
        return table;
    }
}
于 2012-10-04T20:33:48.063 回答
1

你可以做

public Table<T2> getTable<T2>() where T2:MasterClass
{
    return (Table<T2>)(object)table;
}

如果您知道 T 和 T2 将始终是同一类型。如果不是,您将获得运行时异常。

于 2012-10-04T21:05:20.243 回答