【问题标题】:Problems with recursive generic type in c#c#中递归泛型类型的问题
【发布时间】:2012-07-03 00:02:07
【问题描述】:

我有一些 C# 代码在 mono 和 Microsoft 的 .net 编译器下都能正常编译,但只能在 mono 上运行。 错误信息是(我添加的换行符)

Unhandled Exception: System.TypeLoadException:
Could not load type 'Hasse.Groups.Heavy.Product.PowerGroup`1'
from assembly 'Hasse, Version=1.0.x.y, Culture=neutral, PublicKeyToken=null'
because it has recursive generic definition.

该类型实际上有一个递归泛型定义,所以我的问题是:为什么它适用于单声道? [代码运行并产生预期结果]

完整的源代码在这里:https://github.com/miniBill/Hasse

仍然崩溃的精简代码在这里:

public class Group<T> : IWrappableGroup<WrapperGroup<T>> {}

public class WrapperElement<T> {}

public interface IWrappableGroup<U> {}

public class WrapperGroup<T> : Group<WrapperElement<T>> {}

class MainClass {
    public static void Main(string[] args){
        var ng = new Group<object>();
    }
}

这是它在单声道上工作的证据:http://ideone.com/ZvA3I

【问题讨论】:

  • 与其给我们提供大型项目的链接,不如发布一个简短(最小)但完整的示例来说明问题。
  • 让我试着创建一个最小的例子
  • 我已经设法进一步减少了一点......介意我编辑吗? (我一直在尝试减少它,直到它真的最小......)
  • 去做吧。我试过把它变小,但不能:)
  • 完成。只有一个可执行语句...

标签: c# generics exception-handling recursion mono


【解决方案1】:

这是一个known 问题。它可能被报告为编译器错误。

http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf(第 129 页)

至于在 Mono 中工作,就规范而言,有几个地方 Mono 工作被“破坏”了。

Recursive lambdas 是在 Mono 中不应该工作的另一个例子)

【讨论】:

  • 谢谢。虽然我怀疑它在 Mono 中工作的原因与递归 lambda 的原因相同:它可能会爆炸,但它可能有意义(就像我的代码一样)
  • 您能在bugzilla.xamarin.com 中提交“递归 lambdas”问题吗?
猜你喜欢
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多