gpt4 book ai didi

c# - 协变、逆变和消除多余的类型参数

转载 作者:太空宇宙 更新时间:2023-11-03 11:26:10 25 4
gpt4 key购买 nike

给定以下类层次结构:

abstract class A {  }
abstract class B { }
abstract class C { }
abstract class D<TA, TB, TC>
where TA : A
where TB : B
where TC : C { }

class E : A { }
class F : B { }
class G : C { }
class H : D<E, F, G> { }

我想创建一个简单的泛型方法来实例化 D 类型的对象:

void Create<TD>(string description)
where TD : D
{
var instance = Activator.CreateInstance<TD>();
}

但编译器强制指定 D 的类型参数,因此我必须编写以下内容:

void Create<TD, TA, TB, TC>(string description)
where TA : A
where TB : B
where TC : C
where TD : D<TA, TB, TC>
{
var instance = Activator.CreateInstance<D>();
}

这意味着不能写

Create<H>("foo");

我要写

Create<H, E, F, G>("foo");

我的问题是:因为我将 H 指定为具体实例,为什么编译器需要在方法签名上为基类 D 添加额外的类型参数?为什么它不能简单地从 H 中推断出那些?

最佳答案

where TD : D暗示 D 不是通用的,where as where where TD : D<TA, TB, TC>暗示 D 是通用的。

关于c# - 协变、逆变和消除多余的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9262574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com