F # не может видеть абстрактное свойство сериализуемого абстрактного класса C #

Вот мой сериализуемый абстрактный класс

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?


person cnd    schedule 21.08.2012    source источник
comment
Я не знаю терминологии F#, но в C# нет такого понятия, как абстрактное поле; это абстрактное свойство.   -  person Marc Gravell    schedule 21.08.2012
comment
Он ссылается на ввод строки files.[0] и размещение другого DOT и ожидание появления intellisense и представления «поля»... то есть «пути» члена, доступного для использования.. Но вы правы, это неправильное название здесь.   -  person quetzalcoatl    schedule 21.08.2012


Ответы (2)


Хм? Странно.. может быть, какая-то ошибка в чтении метаданных или intellisense. Попробуйте записать файл.[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. Таким образом, это просто должно работать, потому что интерфейсы являются ядром доступа ко многим вещам.

person quetzalcoatl    schedule 21.08.2012
comment
хм... WCF предоставляет как список (INFS) как obj [] для F #, должен ли я сделать вручную :?> Преобразование NFS для объектов? Проект доступен онлайн на github: github.com/nCdy/NENFS - person cnd; 21.08.2012
comment
Мой список‹INEN› транслируется в object[] с помощью svcutil, я думаю, что это плохо. - person cnd; 21.08.2012
comment
возможно, я думаю, что проблема глубже, и сначала мне нужно решить проблему с WCF для предоставления данных массива. stackoverflow .com/questions/12052962/ - person cnd; 21.08.2012
comment
Так вы работаете с WCF и контрактами? Вы не сказали это в вопросе! Тогда почти наверняка это проблема определения контракта! Попробуйте решить, почему они отображаются как объекты - может быть, дело в том, что INFS/NFS не являются DataContract или MarhalByRef и т. д.? - person quetzalcoatl; 21.08.2012
comment
проверьте еще один вопрос по ссылке выше, это сложнее, он работает как общедоступный NEN_FS.NFS[] ls(), но он терпит неудачу по какой-то странной причине, которую я пока не могу понять. - person cnd; 21.08.2012

То, что вы испытываете, является ошибкой, связанной с intellisense (или просто базовой неспособностью intellisense). F# вполне способен «видеть» свойство Path. Просто попробуйте закончить строку let file = files.[0].Path и скомпилировать (или написать в fsi). Вы увидите, что все идет хорошо.

Intellisense — отличный инструмент, но иногда он работает не совсем правильно (иногда я получаю его и при работе с C#). Если полагаться на то, что он всегда будет сообщать самую актуальную и полную информацию, время от времени возникнет некоторая путаница.

person Ken Wayne VanderLinde    schedule 21.08.2012
comment
@МарияШарапова: Я только что попробовала, где files — это NFS list. Он и компилируется, и выполняется в fsi. Вы уверены, что files имеет тип, поддерживающий индексацию? - person Ken Wayne VanderLinde; 21.08.2012
comment
Кен — мой «личный фаворит» в intellisense — это [EditorBrowsable( Никогда)] :) - person quetzalcoatl; 21.08.2012