У меня недавно была странная проблема с одним из моих API-интерфейсов. По существу, по какой-то причине при использовании с кодом VB компилятор VB не выполняет неявное приведение к объекту при попытке вызвать метод ToString ().
Ниже приведен пример минимального кода, во-первых, на C #, а во-вторых, на VB:
Graph g = new Graph();
g.LoadFromEmbeddedResource("VDS.RDF.Configuration.configuration.ttl");
foreach (Triple t in g.Triples)
{
Console.WriteLine(t.Subject.ToString());
}
Выше компилируется и работает нормально, а ниже нет:
Dim g As Graph = New Graph()
g.LoadFromEmbeddedResource("VDS.RDF.Configuration.configuration.ttl")
For Each t As Triple In g.Triples
Console.WriteLine(t.Subject.ToString())
Next
Второй пример VB дает следующее исключение компилятора:
Не удалось разрешить перегрузку, потому что нет
Доступный ToString принимает это
количество аргументов.
Похоже, это связано с тем, что тип свойства t.Subject
, которое я пытаюсь записать в консоль, явно определило ToString()
методы, которые принимают параметры. Компилятор VB, похоже, ожидает использования одного из них, и, похоже, неявно приводит его к Object и использует стандартный метод Object.ToString()
, в то время как компилятор C # делает.
Есть ли способ обойти это, например, опция компилятора VB или лучше всего просто убедиться, что тип свойства (который в данном примере является интерфейсом) явно определяет непараметрический метод ToString()
, чтобы обеспечить совместимость с VB?
Редактировать
Вот дополнительные сведения, запрошенные Lucian
- Graph - это реализация интерфейса, но на самом деле это не имеет значения, поскольку именно интерфейс INode , тип которого возвращает
t.Subject
, является проблемой.
INode определяет две перегрузки для ToString()
, каждая из которых принимает параметры
- Да, это ошибка времени компиляции
- Нет, я не использую скрытие по имени, все API написаны на C #, поэтому я не мог генерировать такого рода API, если бы захотел
Обратите внимание, что с тех пор я добавил явную непараметризованную перегрузку ToString()
к интерфейсу, которая исправила проблему для пользователей VB.