Вопрос

Я использую частичные классы для разделения некоторой функциональности между 2 файлами, но я получаю сообщение об ошибке.Что я делаю не так?

A1.cs:

private partial class A
{
    private string SomeProperty { get { return "SomeGeneratedString"; } }       
}

A2.cs:

private partial class A
{
    void SomeFunction()
    {
        //trying to access this.SomeProperty produces the following compiler error, at least with C# 2.0
        //error CS0117: 'A' does not contain a definition for 'SomeProperty'
    }
}
Это было полезно?

Решение

Находятся ли два частичных класса в одном пространстве имен?Это могло бы быть объяснением.

Другие советы

Тот же ответ, что и у @Andrey K, но простыми словами

Установите действие сборки всех ваших частичных классов на "Компиляцию", используя окна "Свойства" каждого из этих файлов

Properties window - loading= Build action property">

другое пространство имен?

Сначала я не смог воспроизвести вашу ошибку.

Когда эти частичные классы определяются отдельно внутри пространства имен, ключевое слово private приводит к сбою сборки, поскольку "Элементы, определенные в пространстве имен, не могут быть явно объявлены как частные, защищенные или защищенные внутренние"...

Если я сохраню их в тайне и вложу в другой класс, все будет работать нормально.

Я могу воспроизвести вашу ошибку только тогда, когда в одном файле у меня есть часть класса, вложенная внутри другого класса, а в другом файле я НЕ вкладываю класс, а затем удаляю ключевое слово private...вот так:

Класс 1.cs:

namespace stackoverflow.answers
{
    public class Foo
    {
        private partial class Bar
        {
            private string SomeProperty { get { return "SomeGeneratedString"; } }
        }
    }
}

Класс 2.cs:

namespace stackoverflow.answers
{
    partial class Bar
    {
        void SomeFunction()
        {
            string bar = this.SomeProperty;
        }
    }    
}

Я также получаю описанную вами ошибку, если пространства имен отличаются.

Пожалуйста, опубликуйте весь код решения, поскольку предоставленный код является недопустимым синтаксисом C # и не может быть рассмотрен без дополнительного контекста.

Редактировать:

решение:действие сборки -> Дополнить, больше ничего

Я постараюсь быть более конкретным:

У меня был класс, разделяемый между 3 частичными классами в 3 разных файлах.В какой-то момент вызов функции (из одной части функции, объявленной в другой части) начал показывать ошибку "не существует в текущем контексте".Мне потребовалось много времени, пока какой-то парень помогло мне выяснить, что случайно я установил действие сборки файла с одной частью на "EmbeddedResourse" вместо "Compile".

Чтобы переключить действие сборки, вы должны щелкнуть правой кнопкой мыши по файлу в обозревателе решений, затем выбрать свойства.Затем измените действие сборки.

Этот вопрос устарел, и мой ответ не совсем полезен в данном случае.Но это может быть полезно в одном другом очень редком случае, связанном с частичными классами.Извините, если мой английский непонятен.

Я думаю, это потому, что вы объявляете свой класс "приватным".Попробуйте изменить модификатор на "внутренний", чтобы две "половинки" класса могли "видеть" друг друга в пределах одной сборки.

Ошибка, которую я получаю, это:

Элементы, определенные в пространстве имен, не могут быть явно объявлены как частные, защищенные или защищенные внутренние

Я предполагаю, что это проблема с пространством имен, как указывалось ранее.

Все файлы должны находиться в одной папке.

Я анализирую ваш код.вы объявили частичный класс как вложенный класс, это является причиной отображения ошибки.почему частичный класс bcz не будет объявлен как вложенный класс ключевое слово parial разделено на несколько файлов, поэтому каждый файл, который вы объявили во вложенном классе, одинаков, когда вы объявляете его во вложенном классе, он не распознает.

Угловой случай, когда дополнительная помощь может сэкономить ваше время, - это если вы используете частичный класс в дополнение к классу, созданному текстовым шаблоном во время выполнения.

Скорее всего, проблема действительно заключается в том, что пространство имен вашего частичного класса отличается от пространства имен сгенерированной части этого класса.Чтобы проверить это, просто посмотрите на сгенерированный код.

Чтобы исправить это, вам нужно отредактировать .csproj файл для вашего проекта, и в разделе об этом шаблоне добавьте <ClassNamespace> тег:

<Content Include="MyTemplate.tt">
  <Generator>TextTemplatingFilePreprocessor</Generator>
  <ClassNamespace>My.Namespace</ClassNamespace>
  <LastGenOutput>MyTemplate.cs</LastGenOutput>
</Content>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top