繁体   English   中英

泛型:“相机”类型不能用作泛型类型中的类型参数“T”

[英]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>

您可以通过具有PhoneCamera派生自的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM