[英]Implementing an interface with a generic constraint
有点惊讶为什么这不起作用
这是编译器的限制还是不支持它是否合理?
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'.
有关更多更正,请明确实现接口:
public class Class1<T> : IInterface
where T : Test2
{
public T Test { get; private set; }
Test2 IInterface.Test
{
get { ... }
}
}
然后你可以避免编译错误。
由于T
可以是从Test2
派生的任何类型,因此Class1
不会完全实现IInterface
。
更一般地说,不可能通过返回协变类型来实现接口:
interface IFoo
{
object Bar { get; }
}
class Broken : IFoo
{
string Bar { get; } // you cannot expect to implement IFoo this way!
}
将您的界面更改为此,它将编译:
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; }
}
是否可以使您的界面通用,例如
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; }
}
或者你是否试图避免界面上的泛型(这也有很好的理由!)
接口说属性Test是Test2 Type。 在您的实现中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; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.