微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#泛型约束与方法接口

如何解决C#泛型约束与方法接口

可能标题不对,但我想不出更准确的东西。

我有这门课:


    Transport<T> where T: ISomething

我有一个类,我可以在其中使用我的“传输”类和实现我的 ISomething 的泛型。像这样:


    public class Route 
    {
        Transport<ISomething> Transport;
        public Route(Transport<ISomething> t)
        {
            Transport = t;
        }
    }

我希望能够调用我的构造函数


    Transport<Potatoes> myTransport = GetAllPotatoes();
    
    Route myRoute = new Route(myTransport);

有没有办法做到这一点?我是泛型的新手,并且(作为非英语母语人士)我无法使用正确的关键字自己找到答案。

谢谢。

为清楚起见编辑: Potatoes 实现了 ISomething。

解决方法

您也可以使路由通用,如下所示:

public class Route<T>
    {
        Transport<T> Transport;
        public Route(Transport<T> t)
        {
            Transport = t;
        }
    }

然后你可以创建一个路由

   Transport<Potatoes> myTransport = GetAllPotatoes();
    
    Route<Potatoes> myRoute = new Route<Potatoes>(myTransport);

然而,我想这不是您想要的,因为您希望能够创建非通用的路由。在这种情况下,您需要具有 RouteTransport 的非泛型基类。

例如:

public interface ITransport {}

public class Transport<T> : ITransport 
where T: ISomething
{
}

public class Route
    {
        ITransport Transport;
        public Route(ITransport t)
        {
            Transport = t;
        }
    }
,

您可以使用协变接口...在您的情况下:

public interface ISomething {
}

public interface ITransport<out T> where T : ISomething
{
}

public class Transport<T> : ITransport<T> where T: ISomething
{
}

public class Potatoes : ISomething {
}

public class Route 
{
  ITransport<ISomething> Transport;
  public Route(ITransport<ISomething> t)
  {
    Transport = t;
   }
}

public class Program
{
    public static void Main()
    {
        Transport<Potatoes> myTransport = null /* or getAllPotatoes */;   
        Route myRoute = new Route(myTransport);
    }
}

请注意,Route 现在采用 ITransport<T>,而不是 Transport<T>

类中的协方差不起作用,您需要一个接口。

这不会做任何事情,只是让你看到它编译:https://dotnetfiddle.net/T2Yd8N

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。