FluentMigrator从1.2.1升级到3.3.1后调用自定义扩展方法报CS1929错误
问题原因
FluentMigrator 1.x 升级到 3.x 属于跨大版本更新,官方对链式构建API的返回类型做了破坏性变更:
你调用的.WithIdColumn()方法在1.2.1版本执行后返回的是ICreateTableWithColumnOrSchemaOrDescriptionSyntax类型,刚好匹配你自定义扩展方法的入参类型;但3.3.1版本中该方法执行后返回的是ICreateTableColumnOptionOrWithColumnSyntax类型,和你扩展方法要求的入参类型不匹配。
报错里提到的「requires a receiver」(需要接收器)指的是扩展方法要求的调用主体(即this关键字修饰的第一个参数对应的实例对象)类型,和你当前传入的实例类型不兼容,所以无法匹配到对应的扩展方法。
解决方案
直接修改自定义扩展方法的入参类型为3.x链式API通用的返回类型即可,修改后的代码如下:
// 只需要把this后面的入参类型替换为ICreateTableColumnOptionOrWithColumnSyntax public static ICreateTableColumnOptionOrWithColumnSyntax WithCommonColumns(this ICreateTableColumnOptionOrWithColumnSyntax table) { return table.WithColumn("Added").AsDateTime().NotNullable().WithDefaultValue(SystemMethods.CurrentUTCDateTime) .WithColumn("Modified").AsDateTime().Nullable() .WithColumn("Deleted").AsDateTime().Nullable() .WithColumn("IsDeleted").AsBoolean().NotNullable().WithDefaultValue(false); }
如果需要兼容更多链式调用场景,可以额外编写多个不同入参类型的WithCommonColumns重载即可。
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

