[英]The type 'T' cannot be used as type parameter 'T' in the generic type or method
[英]Generics: The type 'Camera' cannot be used as type parameter 'T' in the generic type
interface IResourceProperties
{
}
class TopLevelResource<T>
where T: IResourceProperties
{
}
class Camera: TopLevelResource<CameraProperties>
{
}
class CameraProperties : IResourceProperties
{
}
class Phone: TopLevelResource<PhoneProperties>
{
}
class PhoneProperties : IResourceProperties
{
}
void Main()
{
List<Camera> cameras = new List<Camera>();
List<Phone> phones = new List<Phone>();
DoSomething(cameras);
DoSomething(phones);
}
void DoSomething<T>(List<T> items)
where T: TopLevelResource<IResourceProperties>
{
return;
}
我有上面提到的类层次结构。 通用方法DoSomething
需要能够在相机和手机上工作。 但是我收到以下错误:
类型'Camera'不能在泛型类型或方法'DoSomething(System.Collections.Generic.List)'中用作类型参数'T'。 没有从'Server'到'TopLevelResource'的隐式引用转换。
这表明这是不可能的。
什么是能够一起编写DoSomething并同时处理电话和相机的最佳选择。
你的问题是, TopLevelResource
不工作协 LY,即TopLevelResource<PhoneProperties>
不TopLevelResource<IResourceProperties>
您可以通过具有Phone
和Camera
派生自的IDevice
接口来解决此问题:
interface IDevice<out T> where T : IResourceProperties
请注意, IDevice
是<out T>
所以它是一个变体通用接口 。
具有<out T>
的另一个接口的示例是IEnumerable<out T>
。 如果TDerived : TBase
,则IEnumerable<TDerived>
也是IEnumerable<TBase>
和IEnumerable<object>
你的代码是:
interface IResourceProperties
{ }
interface IDevice<out T>
where T : IResourceProperties
{ }
class TopLevelResource<T> : IDevice<T>
where T : IResourceProperties
{ }
class Camera : TopLevelResource<CameraProperties>
{ }
class Phone : TopLevelResource<PhoneProperties>
{ }
class CameraProperties : IResourceProperties
{ }
class PhoneProperties : IResourceProperties
{ }
internal class Runner
{
public static void Run()
{
List<Camera> cameras = new List<Camera>();
List<Phone> phones = new List<Phone>();
DoSomething(cameras);
DoSomething(phones);
}
static void DoSomething<T>(List<T> items)
where T : IDevice<IResourceProperties>
{
return;
}
}
或者在手机和相机中实现IResourceProperties
interface IResourceProperties
{
}
class TopLevelResource<T>
where T: IResourceProperties
{
}
class Camera: TopLevelResource<CameraProperties>, IResourceProperties
{
}
class CameraProperties : IResourceProperties
{
}
class Phone: TopLevelResource<PhoneProperties>, IResourceProperties
{
}
class PhoneProperties : IResourceProperties
{
}
class Program
{static void DoSomething<T>
(List<T> items) where T : IResourceProperties
{
return;
}
static void Main(string[] args)
{
List<Camera> cameras = new List<Camera>();
List<Phone> phones = new List<Phone>();
DoSomething(cameras);
DoSomething(phones);
}
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.