А нельзя ли что-то минимальное - без dll? А то непонятно, как публиковать баг репорт и как проверять .
Ошибка плавающая. Я не могу выявить закономерности, по которой происходит сбой Intellisence. Сначала он показывал одно при библиотеке (уже на PascalABC.NET) и без нее, потом другое. Возможно, прозвучит странно, но на момент я подумал, что сбой в Intellisence в одном месте влияет на сбой его в другой программе.
Тут возможна другая логика. Он показывает последнюю несбойную версию. Возможно, он не восстанввливается после сбоя.
В любом случае - нет «чёткости», к сожалению. Конечно, хотелось бы, чтобы никаких (!) проблем при просмотре примеров (для библиотеки), в частности, не было. Но, это всего лишь пожелание, которое без действий с моей стороны будет воспринято, на мой взгляд, не очень позитивно. Имелась бы возможность узнать что именно творится в Intellisence, чтобы хотя бы знать актуальную ли версию подсказки он показывает - было бы (для меня) хорошо. Только, мне ничего неизвестно о том как в таких случаях поступают разработчики IDE, чтобы помочь отыскать ошибку.
Я тоже не знаю. Надо смотреть код и дебажить. Я с интеллисенсом никогда не разбирался.
Кстати говоря, сами ошибки я беру отсюда. Если пройтись по примерам, то можно заметить и ошибки, связанные со слабым выводом типов-параметров.
Программа для воспроизведения ошибки (возможно, можно ещё упростить):
function MethodA<T>(self: T): array of T; extensionmethod := nil;
function MethodB<T>(self: IEnumerable<T>; delimiter: string := ''): IEnumerable<T>; extensionmethod := nil;
function MethodB<T, TOutput>(self: IEnumerable<T>; selector: Func<T, TOutput>; delimiter: string := ''): IEnumerable<TOutput>; extensionmethod := nil;
begin
10.MethodA().MethodB();
end.
А в чем здесь ошибка? Intellisense вроде срабатывает
Хотя, недавно воспроизводилась. Сейчас - после перезагрузки IDE - ошибки нет.
Explicit interface implementation - can't define the same method in derived class
type
IA = interface
procedure P();
end;
A = class(IA)
public
procedure IA.P();
begin
end;
end;
B = class(A, IA)
public
procedure IA.P(); // another implementation of P [Program1.pas(15) : Повторное объявление]
begin
end;
end;
begin
end.
Подробности
- Метод обхода проблемы опубликован здесь.
- Затронуты следующие интерфейсы:
NETSquirrel.ICloneable<T>
. - Исправлено в PascalABC.NET 3.5.1.2281.
А по моему вопрос не так должен стоять.
Интерфейсы это фича .Net, поэтому они должны вести себя как в других .Net языках.
Только, по моему, это не та тема для обсуждения этого.
Та, поскольку баг напрямую был выявлен через NETSquirrel
:
В Visual Basic.NET
и C#
- аналогичный код работает, но:
, ибо хоть интерфейсы - это вещь, связанная с NET
(в данном языке), но у нас PascalABC.NET, а не C#
или Visual Basic.NET
.
Вообще, я поднимал этот вопрос, прежде всего, для того, чтобы выяснить должно ли так быть, или нет, а не менять язык. Решающим будет слово разработчиков. Моя задача лишь - донести до них свой вопрос.
Пример с интерфейсом ICloneable<T>
:
Prototype.pas (1.4 KB)
Как минимум, надо сначала сесть и изучить, как такое реализовать в том же FPC, если это вообще возможно. Проще выслушать мнение разработчиков.
Наследовать так, как указано, но только от класса, либо только интерфейс - не проблема, все работает. Можно ли наследовать сразу и от класса, поддерживающего интерфейс, и от этого интерфейса, причем метод с теми же параметрами (точнее, без всяких) - тут я не знаю.
P.S. Кстати, вот так не ругается:
type
IA = interface
procedure P();
end;
A = class(IA)
public
procedure IA.P();
begin
end;
end;
B = class(A)
public
procedure P();
begin
end;
end;
begin
end.
Подозреваю, что если наследуется класс А, наследующий интерфейс, вместе с ним наследуется и интерфейс.
Мне кажется, это Issue. Делайте.
Можно оформить ещё Issue
: LMB
открывает интерфейс ICloneable
, вместо ICloneable<T>
(воспроизводил на том примере).
Нужен код без библиотеки. У меня есть дела поинтереснее, чем минимальный код такой мелочи искать.
LMB click works incorrect in generic interface placed in unit case
uses Test;
uses System;
type
T = class(ICloneable<T>) // LMB click here opens System.ICloneable
public
function Clone(): T := nil;
function ICloneable.Clone(): object := nil;
end;
begin
end.
unit Test;
type
ICloneable<T> = interface(System.ICloneable)
function Clone(): T;
end;
end.
Обязательно использовать модуль, в случае библиотеки (на PascalABC.NET) - не воспроизводится.
Пофиксили