【问题标题】:"java wildcard" to C#?“java通配符”到C#?
【发布时间】:2015-05-12 00:26:12
【问题描述】:

如何将此“java 通配符”转换为 C# 格式?

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

我的 C# 代码不正确

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

如何转换BBB&lt;?&gt;

【问题讨论】:

  • 根本没有与此等效的 C#。
  • 如果没有等价物,有什么用?
  • 你可以让 BBB 类实现一个非泛型接口“YYY”,然后只使用“where T : YYY”。

标签: java c# wildcard


【解决方案1】:

有一个类似的问题C# generic "where constraint" with "any generic type" definition? 不是特定于 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
{}

【讨论】:

    【解决方案2】:

    BBB 到底是什么?

    我打赌BBB&lt;Object&gt; 可能会起作用; BBB 可能是协变类型。

    【讨论】:

    • BBB 意味着 T 必须是定义为 class Something : BBB&lt;Object&gt; 的类型,这是一个封闭的构造泛型类型。所请求的 T 定义甚至可以允许开放构造的泛型类型,例如 class Something&lt;X&gt; : BBB&lt;X&gt; 。请记住,List&lt;object&gt; list = new List&lt;Pineapples&gt;(); 将是一个错误。
    • @Arkaine55 但 OP 正在谈论 C#。我怀疑这里 BBB 是协变类型,在 C# 中 BBB&lt;Pineapple&gt; is-a BBB&lt;Object&gt;
    • @bayou-io 我的评论仅使用 C#。 C# 4 泛型的变化规则需要更明确的定义。 stackoverflow.com/questions/2033912/… 所以如果 BBB 被定义为 class BBB&lt;out T&gt; 你的答案可能会很好。我仍然不喜欢假设 BBB 是什么。
    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多