Я ввел неоднозначную ссылку между iTextSharp.text.Rectangle и System .Рисование.Прямоугольник

#c# #winforms #itext

#c# #winforms #itext

Вопрос:

После добавления следующих using операторов в свой код я получаю множество неоднозначных ссылочных ошибок:

 using iTextSharp.text;
using iTextSharp.text.pdf;
  

Это снимок экрана с ошибками:

Пример

Кто-нибудь знает, что вызывает эти ошибки? Как я могу ввести iTextSharp и избежать этих ошибок?

Комментарии:

1. вы добавили ссылку из NuGet или добавили ее вручную?

2. похоже, что конфликт между двумя версиями одной и той же ссылки..

3. Я добавил его с помощью nuget

4. Похоже, что это преимущественно конфликт имен System.Drawing . Удалите using System.Drawing и / или создайте псевдоним для одного из них.

5. Но, спасибо, я использовал: System . Рисование. Например, прямоугольник.

Ответ №1:

Вы сталкиваетесь с чем-то очень нормальным, и ни один разработчик не назвал бы это «созданием ошибок». Когда разработчик пишет код на C #, он создает классы в определенном пространстве имен. Например: в iText мы создали классы, такие как Font в пространстве iTextSharp.text имен .

Очевидно, что имя класса Font не очень оригинально, есть и другие библиотеки, которые используют то же имя в другом пространстве имен. Есть даже класс, названный Font на языке программирования C #, точнее, в пространстве System.Drawing имен .

Это совершенно нормально. Компилятор может легко увидеть разницу между iTextSharp.text.Font и System.Drawing.Font , потому что они имеют другое полное имя (то есть: полное имя класса, включая пространство имен).

В вашем коде вы путаете компилятор. Вы добавляете using оператор, который позволяет компилятору использовать iTextSharp.text.Font класс. Однако, когда вы используете Font класс в своем коде, вы не указываете, какой Font класс вы собираетесь использовать. Ваш компилятор спрашивает вас: вы имеете в виду использовать iTextSharp.text.Font или System.Drawing.Font ? А также: вы имеете в виду использовать iTextSharp.text.Rectangle или System.Drawing.Rectangle ?

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

Например, без пространства имен ваш компилятор не знает, имели ли вы в виду:

 pnlReport.DrawToBitMap(bm, new System.Drawing.Rectangle(0, 0, width, height));
  

или:

 pnlReport.DrawToBitMap(bm, new iTextSharp.text.Rectangle(0, 0, width, height));
  

Поэтому вы должны использовать:

 pnlReport.DrawToBitMap(bm, new System.Drawing.Rectangle(0, 0, width, height));
  

вместо:

 pnlReport.DrawToBitMap(bm, Rectangle(0, 0, width, height));
  

Вы также можете использовать псевдонимы пространства имен, такие как:

 using sys = System.Drawing;
  

для упрощения подобных вызовов:

 pnlReport.DrawToBitMap(bm, new sys.Rectangle(0, 0, width, height));
  

Комментарии:

1. Вы также можете использовать псевдонимы пространства имен, например, используя sys = System . Рисование; для упрощения вызовов (было бы pnlReport . DrawToBitmap(bm, новая система. Прямоугольник (0, 0, ширина, высота)); затем)

2. Спасибо, я добавил ваш комментарий к своему ответу.