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
需要能够在相机和手机上工作。
但是我收到以下错误:
The type 'Camera' cannot be used as type parameter 'T' in the generic type or method 'DoSomething(System.Collections.Generic.List)'. There is no implicit reference conversion from 'Server' to 'TopLevelResource'.
这表明这是不可能的。
什么是能够通用地编写 DoSomething 并同时处理电话和相机的最佳选择。
最佳答案
你的问题是TopLevelResource
不工作 covariant ly,即 TopLevelResource<PhoneProperties>
不是 TopLevelResource<IResourceProperties>
.
您可以通过 IDevice
来解决这个问题接口(interface)Phone
和 Camera
源自:
interface IDevice<out T> where T : IResourceProperties
请注意 IDevice
是<out T>
所以它是一个 variant generic interface .
另一个接口(interface)的例子有<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;
}
}
关于c# - 泛型:类型 'Camera' 不能用作泛型类型中的类型参数 'T',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28583243/