0

我正在尝试将视图模型转换为列表,然后将其返回到视图,但我得到了不能隐式转换类型错误。

代码:

public ActionResult Index(FeedEventCommand command)
{
    var feedEventViewModel = new FeedEventViewModel
    {
        AnimalId = command.AnimalId,
        AnimalName = command.AnimalName,
        FeederTypeId = command.FeederTypeId,
        FeederType = command.FeederType
    };
    feedEventViewModel = new List<feedEventViewModel>();  <--Error line

    return View(feedEventViewModel);
}

在这种情况下我做错了什么?

4

2 回答 2

2

feedEventViewModel已经声明为单个对象,您不能再次将其声明为List<FeedEventViewModel>(). 其他语言,例如Rust允许您“隐藏”变量声明,但 C# 不允许(并且var只是声明变量的一种更短的方式)。
你可以很容易地解决这个问题:

return View(  new List<FeedEventViewModel>() {
    new FeedEventViewModel{
        AnimalId = command.AnimalId,
        AnimalName = command.AnimalName,
        FeederTypeId = command.FeederTypeId,
        FeederType = command.FeederType
       }
    }
    );
于 2016-11-06T17:11:13.943 回答
1

您可能误解了var关键字在这里的作用。当您声明一个变量时,var您并不是说该变量可以是任何东西,您是在对编译器说它可以计算出类型是什么,而无需您精确指定它。

因此,在您的示例(或稍作修改)中,当编译器遇到代码时:

var feedEventViewModel = new FeedEventViewModel();

它将看到赋值的右侧是类型FeedEventViewModel,因此变量feedEventViewModel将是该类型。实际上,它就像您输入的那样:

FeedEventViewModel feedEventViewModel = new FeedEventViewModel();

以后对该变量的任何使用都必须符合此声明,因此当您执行此操作时feedEventViewModel = new List<feedEventViewModel>();,编译器会正确地说这List<feedEventViewModel>不是feedEventViewModel. 存在隐式转换这样的事情,编译器知道如何在两种不同类型之间进行转换,并且允许在没有特别请求的情况下进行转换,但没有找到这样的隐式转换,因此出现错误。

从提供的信息中不清楚您到底在做什么(您创建的项目是要在列表中吗?您的视图需要一个列表还是单个项目?)。如果您需要包含该项目的列表,那么我会选择:

var list = new List<feedEventViewModel>(){feedEventViewModel };
return View(list);
于 2016-11-06T17:16:19.677 回答