Частичный класс с тем же методом имени

У меня есть частичный класс как это

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 слияние класса во время изготовления? Дайте мне объяснение об этом.

10
задан abatishchev 2 July 2010 в 11:10
поделиться

7 ответов

При попытке скомпилировать этот код будет ошибка времени компиляции !

Во время сборки компилятор объединяет все члены, определенные в , и все частичные определения класса в одно . Затем он попытается скомпилировать его обычным способом.

В вашем случае вызовет ошибку , в которой упоминается , что вы уже определили метод с таким же именем .

17
ответ дан 3 December 2019 в 16:09
поделиться

Они не объединяются: ошибка времени компиляции. Они могут слиться в вашем случае, если вы случайно поместите их в разные пространства имен.

0
ответ дан 3 December 2019 в 16:09
поделиться

Частичные классы объединяются во время компиляции. Компиляторы ищут частичные классы и интегрируют их во время компиляции. Он просто объединяет «два» частичных класса в один класс. В 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 ).

1
ответ дан 3 December 2019 в 16:09
поделиться

Даже помимо синтаксических ошибок ваш код не будет компилироваться. Вы получите следующую ошибку:

Тип 'MyNamespace.ABC' уже определяет член под названием 'GetAge' с теми же типами параметров

Это происходит потому, что компилятор объединяет все части частичного класса в один класс, так как Раздел 10.2 спецификации языка C# объясняет:

За исключением частичных методов (§10.2.7), набор членов типа, объявленных в нескольких частях, является просто объединением набора членов, объявленных в каждой части. Тела всех частей объявления типа разделяют одно и то же пространство объявления (§3.3), а область видимости каждого члена (§3.7) распространяется на тела всех частей.

C# не позволяет иметь методы с одинаковыми именами и с одинаковым количеством и типами аргументов в пределах одного класса. Об этом говорится в разделе 1.6.6 спецификации:

Подпись метода должна быть уникальной в классе, в котором объявлен метод. Подпись метода состоит из имени метода, количества параметров типа и количества, модификаторов и типов его параметров. Подпись метода не включает возвращаемый тип.

Однако есть один вариант - добавить объявление метода в одну часть частичного класса, а реализацию - в другую: Partial Methods. Подробнее о них можно прочитать в статье Эрика Липперта в блоге на эту тему:

В чем разница между частичным методом и частичным классом?

2
ответ дан 3 December 2019 в 16:09
поделиться

Препроцессор (или, возможно, компилятор) сканирует папку вашего проекта во время одного из запусков и проверяет имена классов, которые есть в проекте (или, если быть точным, сборке). Затем он отмечает частичные классы и проверяет, есть ли для них несколько определений.
Спросите Эрика Липперта о деталях. Затем он объединяет методы, комментарии, атрибуты, элементы, интерфейсы и т. Д. Прочитал спецификацию языка C #. У ваших методов нет частичного модификатора, поэтому, как заметили ребята до меня, он не компилируется.

0
ответ дан 3 December 2019 в 16:09
поделиться

Они не объединяются: вы получите ошибку времени компиляции.

0
ответ дан 3 December 2019 в 16:09
поделиться

Он не компилируется, поскольку у вас не может быть двух методов с одинаковым именем в одном классе.

6
ответ дан 3 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: