上下文关键字'var'可能只出现在局部变量声明问题中

时间:2011-07-08 17:50:56

标签: c# .net webmatrix

我知道这意味着什么,我搜索了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);
        }
    }
}

我已经尝试了一些事情,看看它是否有效,但不是。我显然做错了,但这就是我在桌面应用程序中的表现方式,我不明白为什么WebPages会有所不同,以及我这样做会怎么样?

谢谢!

5 个答案:

答案 0 :(得分:5)

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

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

在另一条评论中,您说它无法将IEnumerable<dynamic>投射到string。所以正确声明参数!我不知道它是哪一个。

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

答案 1 :(得分:2)

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

所以假设他们是字符串你会有这个:

  

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

答案 2 :(得分:2)

您不能使用var作为方法参数的类型。它必须是一个真实的类型(字符串,int,Object等)。 var只能在方法内部使用(例如在foreach中)

答案 3 :(得分:1)

这是您的实际代码吗?

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<dynamic>必须是OrderId。

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

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

如果这不起作用,那么你在Session中所做的不是你想象的那样。

关于

  

我尝试了一些事情,看看它是不是   工作,但不。我显然是在做这件事   错了,但这就是我做的方式   桌面应用程序,我不知道它为什么   WebPages的不同之处,以及如何   我会这样做吗?

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

答案 4 :(得分:0)

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

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