У меня есть частичный класс как это
public partial class ABC
{
public string GetName()
{
//some code here
}
public string GetAge()
{
//some code here
}
}
public partial class ABC
{
public string GetSex()
{
//some code here
}
public string GetAge()
{
//some code here
}
}
Как эти 2 слияние класса во время изготовления? Дайте мне объяснение об этом.
При попытке скомпилировать этот код будет ошибка времени компиляции !
Во время сборки компилятор
объединяет все члены, определенные в , и все частичные определения класса в одно . Затем он попытается скомпилировать его обычным способом.
В вашем случае вызовет ошибку , в которой упоминается , что вы уже определили метод с таким же именем .
Они не объединяются: ошибка времени компиляции. Они могут слиться в вашем случае, если вы случайно поместите их в разные пространства имен.
Частичные классы объединяются во время компиляции. Компиляторы ищут частичные классы и интегрируют их во время компиляции. Он просто объединяет «два» частичных класса в один класс. В CLR не делается никаких изменений для реализации частичных классов. Это можно рассматривать как слияние «двух» частичных классов.
Например, для вашего кода у вас будет:
public partial class ABC
{
public string GetName()
{
//some code here
}
public string GetAge()
{
//some code here
}
public string GetSex()
{
//some code here
}
public string GetAge()
{
//some code here
}
}
И это приведет к ошибке, потому что у вас не может быть 2 методов с одинаковым именем и подписью (см. Метод GetAge
).
Даже помимо синтаксических ошибок ваш код не будет компилироваться. Вы получите следующую ошибку:
Тип 'MyNamespace.ABC' уже определяет член под названием 'GetAge' с теми же типами параметров
Это происходит потому, что компилятор объединяет все части частичного класса в один класс, так как Раздел 10.2 спецификации языка C# объясняет:
За исключением частичных методов (§10.2.7), набор членов типа, объявленных в нескольких частях, является просто объединением набора членов, объявленных в каждой части. Тела всех частей объявления типа разделяют одно и то же пространство объявления (§3.3), а область видимости каждого члена (§3.7) распространяется на тела всех частей.
C# не позволяет иметь методы с одинаковыми именами и с одинаковым количеством и типами аргументов в пределах одного класса. Об этом говорится в разделе 1.6.6 спецификации:
Подпись метода должна быть уникальной в классе, в котором объявлен метод. Подпись метода состоит из имени метода, количества параметров типа и количества, модификаторов и типов его параметров. Подпись метода не включает возвращаемый тип.
Однако есть один вариант - добавить объявление метода в одну часть частичного класса, а реализацию - в другую: Partial Methods. Подробнее о них можно прочитать в статье Эрика Липперта в блоге на эту тему:
Препроцессор (или, возможно, компилятор) сканирует папку вашего проекта во время одного из запусков и проверяет имена классов, которые есть в проекте (или, если быть точным, сборке). Затем он отмечает частичные классы и проверяет, есть ли для них несколько определений.
Спросите Эрика Липперта о деталях. Затем он объединяет методы, комментарии, атрибуты, элементы, интерфейсы и т. Д.
Прочитал спецификацию языка C #.
У ваших методов нет частичного модификатора, поэтому, как заметили ребята до меня, он не компилируется.
Они не объединяются: вы получите ошибку времени компиляции.
Он не компилируется, поскольку у вас не может быть двух методов с одинаковым именем в одном классе.