Обнаружилось, что в Nemerle interface mapping работает иначе, чем в C#.
Например, в C# вполне законными (правильно компилируются, верифицируются и работают) являются следующие конструкции:
class Base {
public void Dispose() { }
}
class Derived : Base, System.IDisposable {
new protected void Dispose() { }
}
class Base {
public void Dispose() { }
}
class Derived : Base, System.IDisposable
{
new public static void Dispose() { }
}
В обоих случаях метод интерфейса отображается на public non-static метод Dispose, унаследованный из класса Base.
Компилятор же Nemerle отвергает обе конструкции:
class Base {
public Dispose() : void { }
}
class Derived : Base, System.IDisposable {
new protected Dispose() : void { }
}
1.ncc:6:3:6:37: ←[01;31merror←[0m: method implementing interface member must be public and nonstatic
1.ncc:5:1:7:2: ←[01;31merror←[0m: unimplemented interface method System.IDisposable.Dispose() : void (in Derived type)
class Base {
public Dispose() : void { }
}
class Derived : Base, System.IDisposable {
new public static Dispose() : void { }
}
1.ncc:5:1:7:2: ←[01;31merror←[0m: unimplemented interface method System.IDisposable.Dispose() : void (in Derived type)
Предлагаю:
1) Либо привести алгоритм в соответствие со стандартом C# (чтобы минимизировать сюрпризы для переходящих на Nemerle c C#)
2) Либо оставить как есть, но описать в wiki фактический алгоритм interface mapping'а, используемый компилятором Nemerle.