C>Пишите, пожалуйста, текст ошибки. Ведь не всем хочется для этого думать, как же скомпилировать ваш код.
сама ошибка :
error : in argument #2 (predicate), needed a System.Func[Nemerle.Compiler.TypeInfo-, bool],
got Nemerle.Compiler.TypeBuilder+ -> ?: Nemerle.Compiler.TypeBuilder+ -> ? is not a subtype
of System.Func[Nemerle.Compiler.TypeInfo-, bool] [simple require]
_C_>module Test
_C_> public Former(e : PExpr, typer : Typer) : void
_C_> mutable fld_type
_C_> match (e)
_C_> | <[ $(name : name) : $type ]> => fld_type = type
_C_> | _ => {}
_C_> def fieldTypes(ty :TypeInfo) //здесь проблема, если убрать TypeInfo!
_C_> def fields = match (ty)
_C_> | ty is TypeBuilder =>
_C_> ty.GetParsedMembers().OfType.[ClassMember.Field]().Select(f => typer.BindFixedType(f.ty).TypeInfo)
_C_> | _ => ty.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %| BindingFlags.Instance)\
_C_> .Select(x => x.GetMemType().TypeInfo)
_C_> fields.Where(_ != null)
_C_> def isPrimitiveValue(ty)
_C_> ty.IsValueType && (ty.IsPrimitive || fieldTypes(ty).All(isPrimitiveValue))
_C_> def ti = typer.BindFixedType(fld_type)
_C_> when (isPrimitiveValue(ti.TypeInfo)) {}
_C_>
Разбирая ошибку, я вижу она возникает в двух местах
when (isPrimitiveValue(ti.TypeInfo))
и
fieldTypes(ty).All(isPrimitiveValue))
во втором случае ошибка довольно ясная in argument #1 (ty), needed a Nemerle.Compiler.TypeBuilder+, got Nemerle.Compiler.TypeInfo: Nemerle.Compiler.TypeInfo is not a subtype of Nemerle.Compiler.TypeBuilder [simple require]
то есть в аргументе ty он выводит самостоятельно TypeBuilder а дают TypeInfo, поэтому и ругается невозможно привести базовый тип к конкретному. Честно говоря до конца непонятно почему он фиксирует его как TypeBuilder, видимо потому что указано is TypeBuilder, хотя внешнее использование функции работает с TypeInfo, это какая то эвристика вывода в алгоритме вывода типов. Интересно что Влад поэтому поводу скажет он занимался алгоритмом типизации паттернов.
PS: Вообще лучше использовать не индентный синтаксис, потому как интдентный не поддерживает интеллисенс подсказки, они очень много дают при понимании проблем, показывая какие типы выводятся и подчеркивая неверные места.
Здравствуйте, CodingUnit, Вы писали:
CU>Здравствуйте, _Claus_, Вы писали:
CU>Разбирая ошибку, я вижу она возникает в двух местах CU>
CU>when (isPrimitiveValue(ti.TypeInfo))
CU>
CU>и
CU>
CU>fieldTypes(ty).All(isPrimitiveValue))
CU>
CU>во втором случае ошибка довольно ясная in argument #1 (ty), needed a Nemerle.Compiler.TypeBuilder+, got Nemerle.Compiler.TypeInfo: Nemerle.Compiler.TypeInfo is not a subtype of Nemerle.Compiler.TypeBuilder [simple require]