当前位置:  开发笔记 > 编程语言 > 正文

C#编译器抛出无效参数错误.为什么?

如何解决《C#编译器抛出无效参数错误.为什么?》经验,为你挑选了1个好方法。

我有一个包含两个方法的类:

public String getFoo(Int32 a)
{
  return getBar(a, "b", null);
}

public String getBar(Int32 a, String b, Int32 c)
{
  //do something
  return "";
}

但是当我编译我的课时,我得到两个错误:

    getBar(int,string,int)的最佳重载方法匹配具有一些无效参数

    参数'3':无法从' ' 转换为'int'

我想我理解为什么我得到这个错误:编译器在编译时不知道对象的真实类型是什么.有人可以确认我是否对错误的原因是正确的还是指出了真正的原因?

更重要的是,我可以这样设计我的代码吗?如果是这样,我需要做些什么来修复错误?我这样设计我的类的原因是因为我不想在getFoo中的getBar中复制代码.这两种方法基本上是相同的,除了一个采用第三个参数.

谢谢.



1> FlySwat..:

在.NET中,引用类型和值类型之间存在明显的概念.

引用类型是在堆上分配的对象(它将是System.Object的子类).堆栈上的所有内容都是指向此对象的指针.因此,存储空指针是完全有效的.

值类型是在堆栈上分配的对象,它将是System.ValueType的子类.由于值类型存在于堆栈中,因此将值传递给函数时,会传递对象的全部内容.

值类型不能为null.

大多数C#基元类型都是值类型.String是一种特殊类型的基元,实际上是一种引用类型.

在.NET 2.0中,MS添加了在结构中包含泛型类型的功能,以便它可以模拟可为空的类型.真正发生的是Nullable 结构内部的逻辑正在为您模拟一个null.

他们使用语法快捷方式通过向类型添加问号来表达它,例如:

int? nullableInt = null;
float? nullableFloat = null;

等等...

如果你不喜欢int?语法,你总是可以使用Nullable

public String getBar(Int32 a, String b, Nullable c)

作为旁注,我更喜欢在做你正在做的事情时添加一个重载,只是为了使语法更好.

public String getBar(Int32 a, String b)
{
     this.getBar(a,b,null);
}

public String getBar(Int32 a, String b, Nullable c)
{
}

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有