Java通配符在C#中的对应是什么?

3
我该如何将“Java通配符”转换为C#格式?
public abstract class AAA<T extends BBB<?>> extends CCC<T>{} 

我的错误的C#代码

public abstract class AAA<T> : CCC<T> where T : BBB<?>{}

如何将BBB<?>进行转换?


2
这个东西在C#中没有相应的等价物。 - Dave Doknjas
如果没有等价物,那还有什么用处呢? - Vlad Kisly
2
你可以让类BBB实现一个非泛型接口"YYY",然后只需使用"where T: YYY"。 - Dave Doknjas
2个回答

1

有一个类似的问题C#泛型“where约束”与“任意泛型类型”定义?,与Java通配符无关。那里提供的答案可能会对您有所帮助。

从那个答案中,可能的类签名是:

public abstract class AAA<T, TOther> : CCC<T>
    where T : BBB<TOther>
{}

在C#中,泛型必须具有命名的类型参数,即使您从未打算明确/隐式使用该类型。而且,在方法/类/接口的标识符声明中,所有类型参数都必须命名。
请注意,如果需要,可以使用以下方法将TOther限制为仅对象类型:
public abstract class AAA<T, TOther> : CCC<T>
    where T : BBB<TOther>
    where TOther : object
{}

0

BBB 究竟是什么?

我敢打赌 BBB<Object> 可能会起作用;BBB 很可能是一个协变类型。


BBB<Object> 的意思是 T 必须是一个定义为 class Something : BBB<Object> 的封闭构造泛型类型。所请求的 T 定义甚至可以允许开放构造泛型类型,例如 class Something<X> : BBB<X>。请记住,List<object> list = new List<Pineapples>(); 将会是一个错误。 - Arkaine55
@Arkaine55 但是OP在谈论C#。我怀疑这里的BBB是一个协变类型,在C#中,BBB<Pineapple> BBB<Object> - ZhongYu
@bayou-io 我的评论只涉及C#。C# 4中,泛型的变异规则需要更明确的定义。https://dev59.com/xHI-5IYBdhLWcg3wED5V 因此,如果BBB被定义为class BBB<out T>,你的答案可能是正确的。但我仍然不喜欢假设BBB是什么。 - Arkaine55

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接