C# 在多个泛型约束上没有隐式转换

C# 在多个泛型约束上没有隐式转换,c#,generics,mono,constraints,C#,Generics,Mono,Constraints,使用泛型构建一段C代码我生成的代码如下所示: public class Test<U,V,W> where U : V where V : W { public W Cast(U argument) { return argument; } } 公共类测试 U:V在哪里 其中V:W { 公共W Cast(U参数) { 返回参数; } } 返回行无法编译(在mono 3.2.8.0下:“不能隐式地将类型U转换为W”),尽管看起

使用泛型构建一段C代码我生成的代码如下所示:

public class Test<U,V,W>
    where U : V
    where V : W
{
    public W Cast(U argument)
    {
        return argument;
    }
}
公共类测试
U:V在哪里
其中V:W
{
公共W Cast(U参数)
{
返回参数;
}
}
返回
行无法编译(在mono 3.2.8.0下:“不能隐式地将类型U转换为W”),尽管看起来U必须是W的子类(从技术上讲,可能涉及到值类型,但即使所有三个泛型参数都被限制为引用类型,上述操作也会失败)。如果
U
被约束为直接从
W
派生,则一切正常


上面的代码很容易修复(向V插入一个cast就足够了,当然它总是成功的)。不过,我有两个问题:最重要的是,为什么代码不能按原样编译?最欢迎链接到C#规范(如果有)的相关片段!其次,对
V
的(看似多余的)强制转换是否会在运行时引入(无用的)类型检查?

我的猜测是Mono不理解如果U:V和V:W,那么U:W。试着也加入该约束


编辑:我看到你在回答中提到了这一点(我错过了)。既然如此,我想说这是Mono中的一个bug。只要把约束放进去就可以了?可能会提交一个bug。

1)最有可能是因为实现它的好处实际上是零,2)编译到LINQpad并查看IL就会显示出来。这对我来说很有用。发布原始代码!呃。。。它编译得很好。你到底用什么来构建这段代码?它为所有检查过的人编制,包括我自己。我对这个问题投了反对票,也投了反对票,因为它是不可复制的。如果不可复制,也不负责。在提到这是mono之后,我取消了我的反对票,收回了我的反对票。请先在问题中添加这些细节。谢谢