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 に答える