Until this week, the Democratic primary in the 9th Congressional District had been a low-key affair, lacking the blistering fireworks of the Republican contest.
That ended with a flurry of unusually personal attacks by one candidate.
Christian Cano took aim at rival Dan McCready when the two met at a Thursday night forum sponsored by the Black Political Caucus.
Cano called McCready "privileged and elitist" and accused the former Marine combat veteran of "cowardice" for not speaking up on issues.
Sign Up and Save
Get six months of free digital access to The Charlotte Observer
"I expected lies and attacks in the Republican primary and the general election," McCready responded. "I did not expect it from a fellow Democrat. The problem in our country today is folks like yourself, Mr. Cano, who are dividing our country."
Replied Cano: "I consider him a Republican, so I don't consider it running against another Democrat."
The exchange came as the Democrats vie for the seat held by Republican Rep. Robert Pittenger in the district that stretches from southeast Charlotte to Fayetteville.
The 9th is one of at least two Republican-held districts in North Carolina that Democrats believe they can flip. On Friday, the Cook Political Report became the latest ratings agency to label the district as leaning, not "likely Republican," a move in Democrats' favor. Nationally Democrats need to net 24 seats to win a House majority.
Both Pittenger and primary opponent Mark Harris, a former Charlotte pastor who lost the 2016 primary by 134 votes, have traded attacks in TV ads, with both accusing the other of lying. Clarence Goins of Cumberland County also is in the race.
The heated GOP primary has virtually obscured the contest between the two Charlotte Democrats.
Exciting the base
The 34-year-old McCready, who co-owns a solar energy business, has attracted national attention for his fundraising and a resume that has drawn comparisons to that of Pennsylvania Democrat Conor Lamb, a former Marine who last month won a special election in a heavily Republican district.
Through December McCready had raised $1.2 million, more than all but one N.C. congressional candidate and more than most challengers and even incumbents across the country. He ended the year with $930,000 cash on hand. Cano had $46.
Cano, 51, is a former hospitality industry consultant who in 2016 was his party's sole candidate and nominee. He got 139,000 votes in winning 42 percent of the November vote. He argues that McCready can't excite Democrats enough to win the primary, let alone the general election.
"I don't have a choice, I have to go after him," Cano said. "If I don’t we’re gonna get killed. . . . . How can you get unaffiliated people to vote for you when you can’t even get your Democratic base?"
Cano argues that McCready's voting record shows that until last year, he hasn't voted in party primaries. And over the years he donated to Republican as well as Democratic candidates. And McCready hasn't spelled out positions on many issues.
At the forum, both candidates answered questions about immigration, the minimum wage and the federal budget. A McCready aide said the campaign plans to announce more positions soon.
Cano, who is gay, said McCready can't excite the LGBTQ community, African-Americans and the rest of the Democratic base enough to win the primary, let alone the general election.
But Matt Hirschy, interim executive director of Equality NC, the state's largest LGBTQ organization, has personally endorsed McCready. So has former Charlotte Mayor Harvey Gantt. Many Democrats dispute the notion that the candidate can't excite Democrats.
"I would say quite the contrary because the base is solidly behind him, at least that’s what I see here," said former Union County Sheriff Frank McGuirt. "He’s the real McCoy."
Surluta Anthony, an African-American council member from Monroe, has endorsed McCready. She said she's heard from black and white voters who want to support him.
Cano supporters like John Chachere say the candidate is "authentic" and practical. "He understands the way both sides of the aisle think, and he pulled me in with that," he said.
In recent days, Cano has attacked McCready with a string of emailed invectives. He has called him "a milquetoast (and) Republican lite," a "privileged and elitist rich kid" and "a political coward and a political opportunist of the worst kind."
It's not the first time that Cano has lashed out at McCready and other Democrats.
Last August, after the violence in Charlottesville and President Donald Trump's response, McCready said he was "disgusted that we have a President who won’t call out hate and bigotry for what it is." But Cano, angry over what he saw as McCready's tepid reaction, chastised McCready on Facebook to "stand up for something you p----.”
When Charlotte City Council member Julie Eiselt objected to what she described as a "denigration" of women, Cano tweeted, "When did you become the moral fiber of Charlotte? Get off the cross we need the wood." Cano later apologized.
"McCready's opponent has shown himself to be bombastic and divisive," said Hirschy. "If we really want to push back do it in a way that doesn’t match the other side ... You can’t criticize rhetoric . . . on one hand and then participate in it."
Democratic consultant Dan McCorkle said a lot of Democrats see McCready as someone who could take the congressional seat.
"We have a local guy who went to (Charlotte-Mecklenburg schools), was an Eagle Scout, a Marine . . . When a Democrat sees that it's very attractive to us. We see Conor Lamb in him."
At the end of their caucus forum, McCready mouthed something to Cano as the two shook hands. Cano turned toward the audience at St. Luke Missionary Baptist church and said, "He just called me an a------."
On Friday morning, McCready sent Cano a handwritten apology.