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可以是派生自 的任何类型Test2Class1因此不完全实现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

将您的界面更改为此,它将编译:

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