Подтвердить что ты не робот

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

Можно ли создать частичный класс в разных пространствах имен? Будет ли он работать правильно? e.x:.

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?
    }
}

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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