c# - 泛型:类型 'Camera' 不能用作泛型类型中的类型参数 'T'

标签 c# generics

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)PhoneCamera源自:

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/

相关文章:

c# - 集成许可证处理的设计选择

c# - 为什么 decimal.Parse(10 10) 有效?

java - 修复 java : incompatible types: java. lang.Object 中的错误无法转换为 capture#1 of?

ios - Swift 泛型函数接受枚举

Nullable(Of T) 对象上的 VB.NET 扩展,给出类型错误

c# - ddlChooseReport_Function (ASP.net) 中参数 Object o 和 EventArgs ea 的用途是什么?

c# - 从 winforms 基类显式调用接口(interface)方法

c# - 数据源不支持服务端数据分页

c# - 从通用列表底部删除重复项

java - 使用下限通配符时出现编译错误