【问题标题】:The contextual keyword 'var' may only appear within a local variable declaration issues上下文关键字“var”可能只出现在局部变量声明问题中
【发布时间】:2011-10-01 11:37:14
【问题描述】:

我知道这意味着什么,我搜索过 Google 和 MSDN。但是,我还能如何解决这个问题?

我在 App_Code 文件夹内的 razor 代码中有一个函数(使用 WebMatrix),我从数据库中获取信息,进行一些计算,然后用新的总数更新数据库。

但是,如果 App_Code 文件夹中不允许我将变量传递给我的方法,我该如何?

这是我得到的:

EditQuantity.cshtml(根文件夹):

        try
        {
            Base baseClass;
            baseClass.CalculateTotalPriceInCart(Request.QueryString["PartNumber"], Request.QueryString["Description"], Session["OSFOID"], true);

            Response.Redirect("~/Cart.cshtml");
        }
        catch(Exception exmes)
        {
            message = exmes;
        }

还有,Base.cs(在 App_Code 文件夹内):

using System;
using System.Collections.Generic;
using System.Web;
using System.Text;
using WebMatrix.Data;

/// <summary>
/// Summary description for ClassName
/// </summary>
public class Base
{   
    public void CalculateTotalPriceInCart(var PartNumber, var Description, var OrderId, bool IsBoxed)
    {
        var database = Database.Open("OSF");
        var query = "";
        var result = "";
        decimal price = 0.00M;

        if(IsBoxed)
        {
            // Select item.
            query = "SELECT Boxes, BoxPrice FROM Cart WHERE OrderId = '" + OrderId + "' AND PartNumber = '" + PartNumber + "' AND Description = '" + Description + "' AND IsBoxed = 1";
            result = database.Query(query);

            // Recalculate Price.
            foreach(var item in result)
            {
                price = result.Boxes * result.BoxPrice;
            }

            // Update item.
            query = "UPDATE Cart SET BoxPrice = '" + price + "' WHERE OrderId = '" + OrderId + "' AND PartNumber = '" + PartNumber + "' AND Description = '" + Description + "' AND IsBoxed = 1";
            database.Execute(query);
        }
    }
}

我已经尝试了一些方法来查看它是否有效,但是不行。我显然做错了,但这就是我在桌面应用程序中的做法,我不明白为什么这里的网页会有所不同,我该怎么做?

谢谢!

【问题讨论】:

  • 附带说明:准备好的/参数化的语句是你的朋友。除非您有充分的理由,否则不要通过字符串连接构建查询。

标签: c# .net webmatrix


【解决方案1】:

像往常一样,这很愚蠢。 为什么不使用声明它作为构造函数的返回类型? 作为“规则” var 只能与构造函数一起使用。 如果您对此有一些深层次的问题.. 将 dim 引入 csharp;

只需在编译时更改类引用的标记。

【讨论】:

    【解决方案2】:

    这是你的实际代码吗?

    Base baseClass;
    baseClass.CalculateTotalPriceInCart(Request.QueryString["PartNumber"], Request.QueryString["Description"], Session["OSFOID"], true);
    

    那行甚至不应该编译。

    关于错误转换,请尝试:

    public void CalculateTotalPriceInCart(string PartNumber, string Description, IEnumerable<dynamic> OrderId, bool IsBoxed)
    

    由于 PartNumber 和 Description 来自查询字符串,因此它们肯定是字符串,true 肯定是 bool,所以 IEnumerable&lt;dynamic&gt; 必须是 OrderId。

    但这并不能完全解决问题,因为Session["OSFOID"] 是一些值的集合,而不是单个值。如果您确定它是单个值,请尝试

    CalculateTotalPriceInCart(Request.QueryString["PartNumber"], Request.QueryString["Description"], ((IEnumerable<string>)Session["OSFOID"]).FirstOrDefault(), true);
    

    如果这不起作用,那么您放入 Session 的内容就不是您认为的那样。

    关于

    我已经尝试了一些方法,看看是否可行 工作,但没有。我显然正在这样做 错了,但这就是我的做法 桌面应用程序,我不明白为什么会这样 网页的不同之处,以及如何 我要这样做吗?

    这在桌面应用程序中也不起作用,您根本无法将var 定义为参数类型。你能得到的最接近的是dynamic,它不会给你智能感知(因为编译器不知道类型是什么),但它会让你传递一个编译器不知道的类型并使用它(假设 知道实际的类型是什么)

    【讨论】:

      【解决方案3】:

      您不能使用 var 关键字定义方法参数,因为编译器无法在编译时确定方法签名。

      public void CalculateTotalPriceInCart(
               string Description, 
               string PartNumber, 
               string OrderId, 
               bool IsBoxed)
      

      在另一条评论中,您说它不能将IEnumerable&lt;dynamic&gt; 转换为string。所以正确声明参数!我不知道是哪个。

      public void CalculateTotalPriceInCart(
               IEnumerable<dynamic> Description, // for example
               string PartNumber, 
               string OrderId, 
               bool IsBoxed)
      

      【讨论】:

      • 我已经尝试过了,但它给了我这个错误:Cannot implicitly convert type 'System.Collections.Generic.IEnumerable&lt;dynamic&gt;' to 'string'
      • 查看我的更新,Jase。我无法知道您的论点是什么类型。您需要查看您要传递的内容。
      【解决方案4】:

      您不能使用var 作为方法参数的类型。它必须是真实类型(字符串、整数、对象等)。 var 只能在方法内部使用(比如在你的 foreach 中)

      【讨论】:

      • 我尝试使用字符串,但随后它抛出了一个Cannot implicitly convert type 'System.Collections.Generic.IEnumerable&lt;dynamic&gt;' to 'string' 异常
      • 那么你应该使用 IEnumerable 作为类型,或者可能只是使用 IEnumerable
      • 我尝试使用动态作为类型,但在我的问题中给出了完全相同的错误
      • 你有其他函数接受 var 参数吗?允许动态作为方法类型。另外,试试 IEnumerable
      • 是的,请尝试用实际问题来清理您的问题。 here, now 的问题是现有答案回答了您提出的问题,但他们没有回答有关您遇到的 problem 的问题,这与任何问题都不相同更多的。您应该考虑在此处接受答案,并重新发布具有不同详细信息的新问题。意义横向迁移的问题就是这样的问题。
      【解决方案5】:

      只需将参数列表中的变量替换为具体类型即可。

      所以假设它们是字符串,你会得到这样的:

      公共无效 CalculateTotalPriceInCart(字符串 PartNumber,字符串 描述,字符串 OrderId, bool IsBoxed)

      【讨论】:

      • Nooope!没用对不起。已经试过了,得到这个:Cannot implicitly convert type 'System.Collections.Generic.IEnumerable&lt;dynamic&gt;' to 'string'
      • 哪个变量作为 IEnumerable 传入?听起来您在填充这些变量的代码中也可能存在问题,因为听起来一个是作为一个集合传入的,尽管代码似乎需要单个值。无论如何,解决方案是为您的参数提供与传入内容匹配的实际类型,但在此之前您需要确保这些变量持有您认为的类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 2015-03-14
      • 2020-09-20
      相关资源
      最近更新 更多