[BUG] И снова о дружбе между Nemerle и BLToolkit
От: rameel https://github.com/rsdn/CodeJam
Дата: 19.05.07 10:59
Оценка: 12 (1)
Нижеприведенный код вызывает рантайм ошибку, (аналогичный код на Шарпе отрабатвает нормально), причем проявляется это только, если попытаться переопределить любой базовый виртуальный метод. Причем ошибка зависит от того, какой из методов был переопределен. Если откомпилирвать этот код как есть получаем такой отлуп

Type 'Sample.PersonAccessor' from assembly 'Sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' tried to override method 'GetName' but does not implement or inherit that method.


если, наоборот, закоментировать код (1) и откоментировать код (2), то ошибка будет уже такой

Signature of the body and declaration in a method implementation do not match. Type: 'Sample.PersonAccessor'. Assembly: 'Sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.


Не знаю, может это связано с тем, что сигнатура базового метода Немерле описывается так (Reflector показывает override вместо virtual)
.method family hidebysig virtual instance string GetName() cil managed

в то время как Шарп генерирует такой код с ключевым словом newslot
.method family hidebysig newslot virtual instance string GetName() cil managed

Я не специалист по мсилу, но других явных изменений я не увидел. Пробовал также поиграться с илдасмом, но без успешно, код как падал так и падает . Короче нужна ваша срочная помощь (тут со слезами умоляющий смайлик ), а сам я в компилятор залазить пока боюсь .

В баг-трекер не репортил, ибо не смогу доступно объяснить на английском
Вот сам код:
using System;
using System.Console;

namespace Sample
{
    public class BizEntityAccessor[T, A]
        where T : BizEntity[T]
        where A : BizEntityAccessor[T, A]
    {
        protected virtual GetName() : string { "OK!"; }
        protected virtual SelectByKey(_: int): T { null; }        
    }
    
    public class BizEntity[T] where T : BizEntity[T]
    {    
    }
    
    public class Person : BizEntity[Person]
    {
        public ID  : int    { get; set; }
        public Name: string { get; set; }
    }
    
    public class PersonAccessor: BizEntityAccessor[Person, PersonAccessor]
    {
        protected override GetName() : string // (1)
        {
            "Ooops";
        }
        
        //protected override SelectByKey(_: int): Person //(2)
        //{
            //WriteLine("Ooops");
            //null;
        //}
    }
    
    module Program
    {
        Main() : void
        {
            Console.WriteLine(typeof(PersonAccessor));
            _ = Console.ReadKey();
        }
    }
}
... << RSDN@Home 1.2.0 alpha rev. 677>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.