Ответ 1
Имя класса включает в себя пространство имён, поэтому name1.Foo
и name1.name2.Foo
- два совершенно разных типа. Поэтому короткий ответ на ваш вопрос: Нет.
Зачем вам нужно что-то подобное?
Можно ли создать частичный класс в разных пространствах имен? Будет ли он работать правильно? 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?
}
}
Что мне делать, чтобы заставить его работать? (если мой пример неверен)
Имя класса включает в себя пространство имён, поэтому name1.Foo
и name1.name2.Foo
- два совершенно разных типа. Поэтому короткий ответ на ваш вопрос: Нет.
Зачем вам нужно что-то подобное?
Частичный класс возможен только в том же пространстве имен и той же сборки.
Пространство имен может быть в двух разных сборках, но частичный класс не мог.
Вот некоторые моменты, которые следует учитывать при реализации частичных классов: -
Используйте частичное ключевое слово в каждой части частичного класса.
Имя каждой части частичного класса должно быть одинаковым, но имя исходного файла для каждой части частичного класса может быть разным.
Все части частичного класса должны находиться в одном пространстве имен.
Каждая часть частичного класса должна быть в одной сборке или DLL, другими словами, вы не можете создать частичный класс в исходных файлах другого проекта библиотеки классов.
Каждая часть частичного класса имеет такую же доступность. (например, частные, общедоступные или защищенные)
Если вы наследуете класс или интерфейс для частичного класса, он наследуется во всех частях частичного класса.
Если часть частичного класса запечатана, то весь класс будет запечатан.
Если часть частичного класса является абстрактной, тогда весь класс будет считаться абстрактным классом.
Это не сработает. Компилятор даст вам двусмысленную ошибку имени в строке Foo classFoo = new Foo();
. Чтобы частичные классы работали, они должны находиться в одном пространстве имен, потому что пространство имен фактически является частью полного имени типа.
Кроме того, для статических классов вы можете реализовать что-то вроде этого с помощью нового С# 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. Но частичные классы - это не так, как заметили другие.
Ограничения на частичные классы и методы из MSDN https://msdn.microsoft.com/en-us/library/wa80x488.aspx