Частичный класс в разных пространствах имен

могу ли я создать частичный класс в разных пространствах имен? Будет ли это работать правильно? е.х.:

class1.cs

namespace name1
{
    public partial class Foo
    {
        Bar1(){
            return 10;
        }
    }
}

class2.cs

namespace name1.name2
{
    public partial class Foo
    {
        Bar2(){
            return 100;
        }
    }
}

main.cs

using name1;
using name1.name2;

namespace mainClass
{
    public class mainClass
    {
        Foo classFoo = new Foo();
        int Count = classFoo.Bar1() + classFoo.Bar2();
        // Will Count = 110?
    }
}

что я должен сделать, чтобы заставить его работать? (если мой пример не верен)

6 ответов


имя класса включает в себя пространство имен, поэтому name1.Foo и name1.name2.Foo - это два совершенно разных типа. Поэтому короткий ответ на ваш вопрос: нет.

зачем вам нужно делать что-то подобное?


частичный класс возможен только в том же пространстве имен и той же сборке.

пространство имен может быть в двух разных сборках, но частичный класс не может.


вот некоторые моменты, которые следует учитывать при реализации частичных классов: -

  • используйте partial ключевое слово в каждой части partial class.

  • имя каждой части частичного класса должно быть одинаковым, но имя исходного файла для каждой части частичного класса может быть разным.

  • все части частичного класса должны находиться в одном пространстве имен.

  • каждая часть частичного класса должен быть в той же сборке или DLL, другими словами, вы не можете создать частичный класс в исходных файлах другого проекта библиотеки классов.

  • каждая часть частичного класса имеет одинаковую доступность. (как частные, общественные или защищенные)

  • Если вы наследуете класс или интерфейс на частичном классе, то он наследуется на всех частях частичного класса.

  • Если часть частичного класса запечатана, то вся класс будет опечатан.

  • Если часть частичного класса абстрактна, то весь класс будет считаться абстрактным классом.


Это не сработает. Компилятор даст вам неоднозначную ошибку имени на Foo classFoo = new Foo(); линии. Для работы частичных классов они должны находиться в одном пространстве имен, поскольку пространство имен является частью полного имени типа.


кроме того, для статических классов вы можете реализовать что-то подобное с помощью свежего C# 6.0 использование статической функции.

считаем:

namespace SomeLogic1
{
    public static class Util
    {
        public static int Bar1()
        {
            return 1;
        }
    }
}

namespace SomeLogic2
{
    public static class Util
    {
        public static int Bar2()
        {
            return 2;
        }
    }
}

namespace GeneralStuff
{
    using SomeLogic1;
    using SomeLogic2;

    public class MainClass
    {
        public MainClass()
        {
            // Error CS0104
            // 'Util' is an ambiguous reference between 'SomeLogic1.Util' and 'SomeLogic2.Util'
            var result = Util.Bar1() + Util.Bar2(); 
        }
    }
}  

правильно, что не компилируется, выдается сообщение об ошибке ясно. Чтобы исправить ситуацию, вы можете напрямую указать пространства имен (но, насколько я понимаю, вы этого не хотите):

namespace GeneralStuff
{
    public class MainClass
    {
        public MainClass()
        {
            var result = SomeLogic1.Util.Bar1() + SomeLogic2.Util.Bar2(); 
        }
    }
}

или вы можете подать заявку использование static характеристика это путь:

namespace GeneralStuff
{
    using static SomeLogic1.Util;
    using static SomeLogic2.Util;

    public class MainClass
    {
        public MainClass()
        {
            var result = Bar1() + Bar2(); 
        }
    }
}

возможно, это нормально сделать для некоторых классов helper / utils. Но частичные классы-это не путь, как заметили другие.


ограничения на частичные классы и метод из MSDN https://msdn.microsoft.com/en-us/library/wa80x488.aspx