F#看不到C#可序列化抽象类的抽象属性

时间:2012-08-21 08:51:32

标签: c# f# abstract abstraction

这是我的可序列化抽象类

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属性?

2 个答案:

答案 0 :(得分:1)

咦?奇怪......可能是元数据阅读或智能感知中的一些错误。尝试写文件。[0]。路径和编译。有时Intellisense会跳过一些东西,但编译器会看到整个结构正确并且编译时没有抱怨。

如果没有工作 - 那么F#可能不喜欢abstract由于我不知道的某些原因(即一些整体的废话,例如实例化&#39;示例对象的可能性)。我还不熟悉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。这样它就必须工作,因为接口是访问许多东西的核心。

答案 1 :(得分:0)

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

Intellisense是一个很棒的工具,但有时它不能正常工作(我现在也可以在C#中工作)。依靠它来总是报告最新和最完整的信息会偶尔引起一些混乱。