14

なぜこれが機能しないのか少し驚いた

これはコンパイラの制限ですか、それともサポートしないのは理にかなっていますか?

public class Class1<T> : IInterface
    where T : Test2
{
    public T Test { get; private set; }
}

public class Test2
{
}

internal interface IInterface
{
    Test2 Test { get; }
}

私が得るエラーは

'ClassLibrary1.Class1<T>' does not implement interface member 'ClassLibrary1.IInterface.Test'. 
'ClassLibrary1.Class1<T>.Test' cannot implement 'ClassLibrary1.IInterface.Test' because it does not have the matching return type of 'ClassLibrary1.Test2'.
4

5 に答える 5

13

さらに修正するには、インターフェイスを明示的に実装します。

public class Class1<T> : IInterface
where T : Test2
{
    public T Test { get; private set; }

    Test2 IInterface.Test
    {
        get { ... }
    }
}

その後、コンパイルエラーを回避できます。

于 2012-10-10T11:15:10.597 に答える
5

からT派生した任意のタイプである可能性があるためTest2、正確にClass1は実装されませんIInterface

より一般的には、共変型を返すことによってインターフェースを実装することはできません。

interface IFoo
{
    object Bar { get; }
}

class Broken : IFoo
{
    string Bar { get; } // you cannot expect to implement IFoo this way!
}
于 2012-10-10T11:09:32.367 に答える
1

インターフェイスは、プロパティ Test が Test2 タイプであると言います。あなたの実装では Class1 プロパティ Test は Test2 を継承したクラスですが、正確には継承していません。やりたいことをするには、次のように書く必要があります。

public class Class1<T> : IInterface
    where T : Test2
{
    private T _test;
    public Test2 Test { get{return _test} }
}

public class Test2
{ 
}

internal interface IInterface 
{
    Test2 Test { get; }
}
于 2012-10-10T11:22:26.413 に答える
1

インターフェイスをこれに変更すると、コンパイルされます。

public class Class1<T> : IInterface<T>
    where T : Test2
{
    public T Test { get; private set; }
}

public class Test2
{
}

internal interface IInterface<T>
    where T : Test2
{
    T Test { get; }
}
于 2012-10-10T11:14:26.490 に答える
1

たとえば、インターフェイスを汎用にすることは可能ですか

public class Class1<T> : IInterface<T>
    where T : Test2
{ 
    public T Test { get; private set; } 
} 

public class Test2 
{ 
} 

internal interface IInterface<T>
{ 
    T Test { get; } 
} 

または、インターフェイスでジェネリックを回避しようとしていますか (それにも十分な理由があります!)

于 2012-10-10T11:15:06.880 に答える