通用接口库:无法从程序集加载类型

时间:2011-01-11 15:47:39

标签: c# generics interface mono

出于实验目的,我试图构建一个二进制搜索树库,从中可以实例化BST以保存唯一的或冗余的节点(冗余节点是一个值与树中另一个相等的值) 。为了可重用,我定义了一个通用接口,ITree和两个子接口:IUnique和IRedundant。

作为我回复Explicit C# interface implementation of interfaces that inherit from other interfaces的原因,库代码可能如下所示[文件名: itest.cs ]:

namespace MyNS {

    public interface INode<T,N>
        where N : INode<T,N> {

        N LChild { get; set; }
        N RChild { get; set; }

        T Value { get; set; }
    }

    public interface ITree<T,N,I>
        where N : INode<T,N> 
        where I : ITree<T,N,I> {

        void Add(N node);
    }

    public interface IUnique<T,N>
        : ITree<T,N,IUnique<T,N>>
        where N : INode<T,N> {
    }

    public interface IRedundant<T,N>
        : ITree<T,N,IRedundant<T,N>>
        where N : INode<T,N> {
    }

    public class Node<T>
        : INode<T,Node<T>> {

        public Node<T> LChild { get; set; }
        public Node<T> RChild { get; set; }

        public T Value { get; set; }
    }

    public class Tree<T>
        : IUnique<T,Node<T>>,
          IRedundant<T,Node<T>> {

        void ITree<T,Node<T>,IUnique<T,Node<T>>>.Add(Node<T> node) {
            /// Add node only if there is none with an equivalent value ///
        }

        void ITree<T,Node<T>,IRedundant<T,Node<T>>>.Add(Node<T> node) {
            /// Add node regardless of its redundancy ///
        }
    }
}

示例主要方法[文件名: main.cs ]:

public class ITest {
    public static void Main() {
        System.Console.WriteLine(typeof(MyNS.Tree<int>));
    }
}

尝试将库编译为与主可执行文件分开的程序集会导致以下错误:

$ mcs -out:itest.dll -t:library itest.cs
$ mcs -out:itest.exe main.cs -reference:itest
error CS0011: Could not load type 'MyNS.ITree`3[T,N,MyNS.IUnique`2[T,N]]' from assembly 'itest, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
Compilation failed: 1 error(s), 0 warnings

但是,将两者合并在一起的工作方式完全符合预期:

$ mcs -out:itest.exe main.cs itest.cs
$ mono itest.exe
MyNS.Tree`1[System.Int32]

为了保持模块化,我如何将库与应用程序逻辑分开?

编辑(2010年1月11日):是的,它是Mono 2.8.x的一个错误,并已在2.10版中修复。

1 个答案:

答案 0 :(得分:2)

我不熟悉单声道编译器,所以我不能告诉你正确的语法,但我认为更简单的答案是你的第二个库没有正确引用迭代库。他们正确地编译在一起证明你的代码是正确的。

我认为你有99%的方式......只需仔细检查你的参考语法。