Kann nicht implizit konvertiert anonymen Typ #1 [], um anonyme Typ #2[]
Ich habe Folgendes Szenario:
public JsonResult ChangeFilterList(int option)
{
var data = new[] { new { Text = "Unknown option", Value = -1 } };
switch (option)
{
case 2: data = _departmentnameRepository.All.Select(x => new { Text = x.DeptName, Value = x.Id }).ToArray();
break;
case 3: data = Session["projectid"] == null
? _assetSequenceRepository.All.Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray()
: _assetSequenceRepository.FindBy(p => p.ProjectId == (int)Session["projectid"]).Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray();
break;
default: data = _userRepository.All.Select(x => new { Text = x.DisplayName, Value = x.UserID }).ToArray();
break;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
case2
und default
sieht toll aus-aber beschwert sich auf Fall 3 (bedingt), nämlich: Cannot implicitly convert type 'AnonymousType#1[]' to 'AnonymousType#2[]'
. Sollte nicht ?:
in der Lage sein zu entscheiden der Art, da ich bereits lieferte die Blaupause für das anonyme als var data = new[] { new { Text = "Unknown option", Value = -1 } };
.
Lösung:
@Darin Dimitrov Antwort ist toll, aber ich möchte ein paar Tests mit anonymen Typen (Einfache Fälle immer es nötig ist).
Wie @Douglas verdächtigen : Meine assetSequenceRepository
liefert id
als long
und anonyme Value
geht zu Gunsten der int
nicht long
. seit C# - compiler nicht implizit cast long
zu int
ich habe den Fehler. Kompilieren snippet:
public JsonResult ChangeFilterList(int option = 3)
{
var data = new[] { new { Text = "Unknown option", Value = long.MaxValue } };
switch (option)
{
case 2: data = _departmentnameRepository.All.Select(x => new { Text = x.DeptName, Value = (long)x.Id }).ToArray();
break;
case 3: data = Session["projectid"] == null
? _assetSequenceRepository.All.Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray()
: _assetSequenceRepository.FindBy(p => p.ProjectId == (int)Session["projectid"]).Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray();
break;
default: data = _userRepository.All.Select(x => new { Text = x.DisplayName, Value = (long)x.UserID }).ToArray();
break;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
- Ein einfacher workaround wäre, Sie zu ersetzen Ihre
?:
- Anweisung mit einerif…else
block. - Ich habe versucht, aber gleiche Wirkung, weiß nicht, was falsch ist.
- Welche Fehlermeldung erhalten Sie mit einem
if…else
? Und erhalten Sie den Fehler in derif
Zuordnung, dieelse
Zuordnung, oder beides? - Beachten Sie, dass die Initialisierung Daten zu
new[] { new { Text = "Unknown option", Value = -1 } }
in überflüssig, da es verworfen wird in derswitch
block. - gleichen Fehler zweimal für
if
undelse
blockieren. - Wenn ich das nicht tun und schreiben
var data;
odervar data = null
, der compiler beschwert sich: weisen Sie etwas von der impliziten variabledata
und kann es nicht zuordnennull
zudata
beziehungsweise.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Vermutung ist, dass Ihr
FindBy
- Methode gibt Objekte, deren Eigenschaften die verschiedenen Arten von denen Sie erwarten sind (z.B.int?
stattint
). Versuchen Sie, eine Typumwandlung, um sicherzustellen, dass Ihre anonymen Typ hat die richtige definition:Den Schlüssel zu ändern ist:
assetSequenceRepository
Rücksendung id so lange, wie ein Neuling Fehler, Nun seine Zusammenstellung perfekt. Danke, ich bin akzeptieren Sie Ihre Antwort.Sind Sie setzen der compiler auf eine echte Probe hier. Schreiben Sie einfach ein view-Modell zum Ende seiner leiden und die Dinge etwas expliziter:
und dann projizieren Sie Ihre LINQ-Abfragen auf das view-Modell zu vermeiden, alle möglichen Mehrdeutigkeiten, die entstehen können aus der Nutzung der bedingte operator und anonyme Typen:
Folgenden test-code kompiliert wird gut:
Habe ich nur geändert das repository Aufrufe
Enumerable.Range()
undSelect
lambda-gutestring
/int
Eigenschaften Werte.Ich würde vermuten, dass Sie gezeigt haben, dass der nutzen nicht genau den code, den Sie versuchen zu kompilieren. Und in deinem realen code, den Sie haben eine Eigenschaft mit nicht passenden Namen (z.B. falsche Gehäuse) oder falscher Typ.
Können Sie versuchen, es herauszufinden, indem Sie Ihre Maus-Zeiger über
ToArray()
nennen. Es wirda is new { string Text, int Value }
gedruckt auf den tooltip.{ Text = "Unknown option", Value = -1 }
in jedem Fall.