为什么在子类中使用时找不到F#成员

时间:2010-05-16 04:51:48

标签: inheritance f# f#-interactive

对于我的所有DAO对象,我都有一个我想要继承的基类型,但是这个成员会因为没有被定义而进一步失误:

type BaseDAO() =
    member v.ExecNonQuery2(conn)(sqlStr) =
        let comm = new MySqlCommand(sqlStr, conn, CommandTimeout = 10)
        comm.ExecuteNonQuery |> ignore
        comm.Dispose |> ignore

我继承了这种类型:

type CreateDatabase() =
    inherit BaseDAO() 

    member private self.createDatabase(conn) =
        self.ExecNonQuery2 conn "DROP DATABASE IF EXISTS restaurant"

这是我在交互式shell中运行脚本时看到的内容:

--> Referenced 'C:\Program Files\MySQL\MySQL Connector Net 6.2.3\Assemblies\MySql.Data.dll'

[Loading C:\Users\jblack\Documents\Visual Studio 2010\Projects\RestaurantService\RestaurantDAO\BaseDAO.fs]

namespace FSI_0106.RestaurantServiceDAO
  type BaseDAO =
    class
      new : unit -> BaseDAO
      member
        ExecNonQuery2 : conn:MySql.Data.MySqlClient.MySqlConnection ->
                          sqlStr:string -> unit
      member execNonQuery : sqlStr:string -> unit
      member
        execQuery : sqlStr:string *
                    selectFunc:(MySql.Data.MySqlClient.MySqlDataReader ->
                                  'a list) -> 'a list
      member f : x:obj -> string
      member Conn : MySql.Data.MySqlClient.MySqlConnection
    end

[Loading C:\Users\jblack\Documents\Visual Studio 2010\Projects\RestaurantService\RestaurantDAO\CreateDatabase.fs]


C:\Users\jblack\Documents\Visual Studio 2010\Projects\RestaurantService\RestaurantDAO\CreateDatabase.fs(56,14): error FS0039: The field, constructor or member 'ExecNonQuery2' is not defined

我很好奇我做错了什么。

我试过不继承,只是在函数中实例化BaseDAO类型,但是我得到了同样的错误。

我开始使用这条路径,因为我有一个具有相同错误的属性,所以看起来我可能有一个问题,我如何定义我的BaseDAO类型,但它编译没有错误,这进一步混淆关于这个问题。

1 个答案:

答案 0 :(得分:2)

看起来好像你是#load个别文件,也许你的历史记录中有一些东西,而你继承的类是在另一个命名空间/模块中,你继承了一些旧的没有该成员的版本?

重置你的fsi会话并重新开始,或者将它放在.fs文件中以诊断是否有任何错误,但我认为代码是正确的,问题与你如何与FSI交互有关。