【问题标题】:C# Unclear Syntax in foreachforeach 中的 C# 语法不明确
【发布时间】:2015-02-17 10:24:14
【问题描述】:

我在 C# 项目的脚手架视图中找到了这段代码,但我并不真正理解“列表”部分之后的语法。为什么要在编写 ViewBag.data 之前声明价格列表?因为 ViewBag.Data 已经包含一个将价格转换为列表的查询,所以我不明白为什么会发生这种情况

@foreach (var x in ((List<WebCashRegister.Models.BLModels.Price>)ViewBag.data).Where(x => x.ProductId == item.Id).OrderByDescending(x => x.StartDate).Take(1))

这是完整的查询,但我的问题只是关于这部分:

List<WebCashRegister.Models.BLModels.Price>)ViewBag.data

这个语法是如何工作的?谢谢!

【问题讨论】:

  • 这不是变量声明,这是类型转换。
  • 是的,它是将 ViewBag.data 属性转换为类型:List 这不应该是一个问题。

标签: c# list model-view-controller lambda


【解决方案1】:

这告诉编译器ViewBag.data 可以是任何东西,因为你可以在ViewBag 中放入任何你想要的东西,它的类型是List&lt;WebCashRegister.Models.BLModels.Price&gt;

这是一个显式转换的例子:

List<object> myList = new List<object>();
MyAunt terry = new MyAunt();
myList.Add(terry);

现在如果你有一个函数

public void Congratulate(MyAunt somebody)

那么你不能只是打电话

Congratulate(myList[0]);

因为编译器不知道它是正确的类型。所以你必须通过说来帮助编译器

Congratulate((MyAunt) myList[0]);

【讨论】:

  • 你的答案至少应该提到“类型转换”...强制是一种隐式转换(转换),问题是指一个显式类型转换...见stackoverflow.com/questions/8857763/…
  • 在您看来,当然。我只是想尽我所能提供帮助。谢天谢地,这里有像你这样具有巨大 Stack Overflow 分数的上帝角色,让我再次直言不讳。
  • 不管怎样@dna2,它不值得投反对票,这只是小事。
  • 如果都是积分的话,你可以放心,我已经撤掉了downvote :) 如果只是因为我的分数比你的低,对不起我敢纠正你。让我记住:michael.richter.name/blogs/…
  • 感谢所有答案,尤其是您的 Roy!现在一切都说得通了,正如其他人所说,我查找了确实很有帮助的类型转换。
【解决方案2】:

因为ViewBag 被定义为dynamic。一旦需要将其视为 List&lt;Price&gt; 以执行某些 LINQ 操作,您必须将其显式转换为适当的(原始)类型。

ViewBagdynamic

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多