2

这是我的可序列化抽象类

namespace NEN_FS {
    [Serializable()]
    abstract public class NFS : IEquatable<NFS> {
        abstract public string Path { get; set; }
        public NFS() {
            Path = "";
            }
        public NFS(string path) {
            Path = path;
            }
        public override bool Equals(object obj) {
            NFS other = obj as NFS;
            return (other != null) && ((IEquatable<NFS>)this).Equals(other);
            }
        bool IEquatable<NFS>.Equals(NFS other) {
            return Path.Equals(other.Path);
            }
        public override int GetHashCode() {
            return Path != null ? Path.GetHashCode() : base.GetHashCode();
            }
        }
    }

我在 F# 中有什么:let file = files.[0].并且没有 Path 字段。

这是为什么?如何访问 Path 属性?

4

2 回答 2

1

嗯?奇怪..可能是元数据读取或智能感知中的一些错误。尝试写入 file.[0].Path 并编译。有时 Intellisense 会跳过某些内容,但编译器会正确地看到整个结构并且可以毫无怨言地进行编译。

如果不工作 - 那么也许 F# 不喜欢abstract我不知道的某些原因(即一些整体的废话,比如不可能实例化一个“示例对象”)..我还不流利地使用 F#,但正在考虑 .Net本身,您是否尝试过定义和使用接口而不是抽象基础?我是说:

namespace NEN_FS {
    public interface class INFS : IEquatable<NFS>
    {
        string Path { get; set; }
    }

    [Serializable()]
    abstract public class NFS : INFS {
        abstract public string Path { get; set; }
        public NFS() {
            Path = "";
            }
        public NFS(string path) {
            Path = path;
            }
        public override bool Equals(object obj) {
            NFS other = obj as NFS;
            return (other != null) && ((IEquatable<NFS>)this).Equals(other);
            }
        bool IEquatable<NFS>.Equals(NFS other) {
            return Path.Equals(other.Path);
            }
        public override int GetHashCode() {
            return Path != null ? Path.GetHashCode() : base.GetHashCode();
            }
        }

然后暴露IEnumerable<INFS> Files而不是IEnumerable<NFS> Files. 这样它就必须工作,因为接口是访问许多东西的核心。

于 2012-08-21T09:08:11.143 回答
0

您遇到的是与智能感知相关的错误(或者只是智能感知的基本无能)。F# 完全能够“看到”该Path属性。只需尝试完成该行let file = files.[0].Path并编译(或将其写入 fsi)。你会看到一切都很顺利。

Intellisense 是一个很棒的工具,但有时它不能很好地工作(我有时也会在使用 C# 时得到它)。依靠它来始终报告最新和最完整的信息会不时引起一些混乱。

于 2012-08-21T09:28:02.777 回答