Библиотека универсального интерфейса: не удалось загрузить тип из сборки - PullRequest
2 голосов
/ 11 января 2011

В экспериментальных целях я пытаюсь создать библиотеку бинарного дерева поиска, из которой может быть создан экземпляр BST для хранения либо уникальных, либо избыточных узлов (с избыточным узлом, являющимся одним со значением, эквивалентным другому в дереве),Для возможности повторного использования я определил один универсальный интерфейс, ITree и два подчиненных интерфейса: IUnique и IRedundant.

Причина моего ответа на Явная реализация интерфейса C # интерфейсов, которые наследуются от других интерфейсов, код библиотеки может быть продемонстрирован следующим образом [Имя файла: 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 [Имя файла: 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]

Чтобы поддерживать модульность, как я могу хранить библиотеку отдельно от логики моего приложения?

EDIT (11 января 2010 г.): Да, это была ошибка в Mono 2.8.x, и она была исправлена ​​в версии 2.10.

1 Ответ

2 голосов
/ 11 января 2011

Я не знаком с моно-компилятором, поэтому не могу сказать вам правильный синтаксис, но я думаю, что более простой ответ заключается в том, что ваша вторая библиотека неправильно ссылается на самую первую библиотеку. То, что они правильно скомпилированы, свидетельствует о том, что ваш код верен.

Я думаю, что вы на 99% пути ... просто дважды проверьте синтаксис ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...