Частичный класс в разных пространствах имен
могу ли я создать частичный класс в разных пространствах имен? Будет ли это работать правильно? е.х.:
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