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 einer if…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 der if Zuordnung, die else 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 der switch block.
  • gleichen Fehler zweimal für if und else blockieren.
  • Wenn ich das nicht tun und schreiben var data; oder var data = null, der compiler beschwert sich: weisen Sie etwas von der impliziten variable data und kann es nicht zuordnen null zu data beziehungsweise.

InformationsquelleAutor Bishnu Rawal | 2013-10-07
Schreibe einen Kommentar