Частичный класс в разных пространствах имен - PullRequest
56 голосов
/ 22 декабря 2010

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

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 ]

83 голосов
/ 22 декабря 2010

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

Зачем вам нужно что-то подобное?

26 голосов
/ 19 декабря 2012

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

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

10 голосов
/ 27 июня 2014

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

  • Использовать частичное ключевое слово в каждой части частичного класса.

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

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

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

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

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

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

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

7 голосов
/ 22 декабря 2010

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

3 голосов
/ 25 октября 2016

Кроме того, для статических классов вы можете реализовать нечто подобное с помощью свежего 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(); 
        }
    }
}

ИЛИ вы можете применить , используя статическую функцию следующим образом:

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

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

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

2 голосов
/ 27 марта 2015

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

...