使用方法覆盖的奇怪编译错误

时间:2010-11-29 20:20:59

标签: c# .net asp.net

我有一个ProductService类,它定义了以下方法。它不起作用,我将在下面进一步解释,但它给出了编译错误 CS1061:'ProductService'不包含'GetByid'的定义。除非我放弃了方法重载,否则为什么其他代码看不到GetById的公共过载?

public IEnumerable<Product> ListActiveByCatId(Guid catId) {
    return _entityContext.Products
        .Include("Category")
        .Where(p => p.Category.id == catId);
}

public Product GetById(string productId) {        
    return new Product();
}

private Product GetByid(Guid productId) {
    return _entityContext.Products.First(p => p.id == productId);
}

我使用ProductService使用以下代码,并且调用上有两个编译错误:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack) {
        var productId = Request["productId"];
        if (productId == null) {
            // TODO How to get the actual parameter, not default parameter.
            productDetailDataSource.SelectParameters["productId"].DefaultValue = DefaultProductId;
        }
        *itemTitleLabel.Text = _productService.GetByid(productId).Name;*
    }
}

确切的编译错误是:

  

C:\ SCS \产品\ Details.aspx.cs(21,51):   错误CS1061:'ProductService'有   不包含'GetByid'的定义   没有扩展方法'GetByid'   接受第一个类型的参数   可以找到'ProductService'(是   你错过了使用指令或   装配参考?)

第21行是我试图强调的,即上面调用代码中带有星号的那一行。

4 个答案:

答案 0 :(得分:4)

GetByid!= GetById

你有套管问题。

答案 1 :(得分:4)

首先,您的 GetByid 方法设置为private,因此无法从您的课外访问。

其次, GetByid 方法实际上不是 GetById 方法的重载,因为C#区分大小写,并且您的方法名称都不相同,考虑了大小写

第三,Request["productId"]不会返回对象吗?如果是这样,则可能无法进行直接类型转换,从而导致编译器无法找到以对象作为输入参数的方法的重载。

编辑#1

  

C:\ SCS \ Products \ Details.aspx.cs(21,51):错误CS1061:'ProductService'不包含'GetByid'的定义,也没有扩展方法'GetByid'接受类型'的第一个参数可以找到ProductService'(您是否缺少using指令或程序集引用?)

Request["productId"]返回的对象似乎是您的ProductService类的实例,该值会提供给您的GetByid方法。我看不到任何GetById方法重载将ProductService的实例作为输入参数。

也许使用多态可能有助于您了解这里发生了什么。 var关键字是已解析类型的占位符,因此值得您使用Request["productId"]对象类型。因此,如果此调用返回的此对象为ProductService,则var将替换为ProductService。在调用GetByid时输入此值会导致GetByid方法的重载应接受ProductService作为参数,但不存在此类重载。默认情况下没有找到可接受的重载,编译器告诉你它无法解析你的方法调用,因为它找不到任何适合调用的方法。

确保Request["productId"]返回预期类型的​​值,该值似乎是 int

我建议您尽可能使用类型而不是var。这可以指出问题的正确来源,例如,类型object无法直接转换为int或类似的东西。

答案 2 :(得分:3)

检查外壳。我建议不要仅根据情况改变方法名称(至少不是故意的!)

itemTitleLabel.Text = _productService.GetById(productId).Name;

答案 3 :(得分:0)

var productId = Request["productId"]; 

您的变量productId可能是Object类型,并且您没有方法GetById接受对象作为参数。
如果是这样,我建议你用这个换一行:

var productId = Request["productId"] as string;  

另外,如上所述检查套管(GetById和GetByid)