using System;

class X {}
class Y: X {}

class Wrapper<T> where T : X {}

public class HelloWorld
{
    public static void Main(string[] args)
    {
        Wrapper<Y> y = new();
        
        Wrapper<X> x = y; // Error here
    }
}

错误为error CS0029: Cannot implicitly convert type 'Wrapper<Y>' to 'Wrapper<X>'

这里我想把Wrapper<Y>转换成Wrapper<X>.

我怎么能这样做呢?

推荐答案

您可以通过使用协变接口来使其工作.而且您也不需要WHERE子句.

class X { }
class Y : X { }

interface IWrapper<out T> {
    
}

class Wrapper<T> : IWrapper<T> 
{
    
}

public class HelloWorld
{
    public static void Main(string[] args)
    {
        IWrapper<Y> y = new Wrapper<Y>();

        IWrapper<X> x = y;
    }
}

Csharp相关问答推荐

在. NET Core 8 Web API中,当为服务总线使用通用消费者时,如何防止IServiceProvider被释放或空?"

并行令牌更新

EF Core. Income和. AsNoTracking正确用法

如何循环遍历XML文档 node 以使用XSLT存储值

始终保留数组中的最后N个值,丢弃最老的

静态对象构造顺序

共享暂存/生产环境中Azure事件中心的建议配置

C#中Java算法的类似功能

在C#中,非静态接口方法的抽象和虚拟是冗余的吗?

HttpRequestMessage.SetPolicyExecutionContext不会将上下文传递给策略

如何将FindAll()与Nuget包Interop.UIAutomationClient一起使用

具有类型识别的泛型方法

未在Windows上运行的Maui项目

如何从非异步任务中正确返回TypeResult

多个选项卡上的MudForm验证

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

在C#中删除多个不同名称的会话

反编译源代码时出现奇怪的字符

异步等待,如何在Windows窗体中使用它们?

C#:我需要根据换行符拆分字符串,而不是在字符串中用双引号分隔换行符