将派生类作为参数传递给用于基类参数的方法-得到错误
本文关键字:方法 参数 错误 基类 用于 派生 参数传递 | 更新日期: 2023-09-27 18:02:11
在别人指出这篇文章之前,我已经把它看了一遍,运气不太好。
我有一个扩展Bing的LatLon类。map的Location类(文档在这里),主要是为了重写GetHashCode和Equals方法来执行值相等,而不是内置的引用相等,如下所示:
class LatLon : Location
{
public readonly double Latitude;
public readonly double Longitude;
public LatLon(double Latitude, double Longitude)
{
this.Latitude = Latitude;
this.Longitude = Longitude;
}
public override bool Equals(System.Object obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// If parameter cannot be cast to Point return false.
LatLon p = obj as LatLon;
if ((System.Object)p == null)
{
return false;
}
// Return true if the fields match:
return (Latitude == p.Latitude) && (Longitude == p.Longitude);
}
public bool Equals(LatLon p)
{
// If parameter is null return false:
if ((object)p == null)
{
return false;
}
// Return true if the fields match:
return (Latitude == p.Latitude) && (Longitude == p.Longitude);
}
public override int GetHashCode()
{
int hash = 13;
hash = (hash * 92821) + Latitude.GetHashCode();
hash = (hash * 92821) + Longitude.GetHashCode();
return hash;
}
}
在另一节课上,我试着做以下事情:
LatLon l1 = (LatLon) getBinnedLocation(new LatLon(41, -51.000001));
...
private Location getBinnedLocation(Location loc)
{
return new Location(
getBinnedCoord(loc.Latitude, true),
getBinnedCoord(loc.Longitude, false));
}
我是从Java来的c#新手,但我的理解是继承等原则本质上是相同的。那么,为什么LatLon l1 = (LatLon) getBinnedLocation(new LatLon(41, -51.000001));
行会导致错误:The best overloaded method match for 'SomeClass.getBinnedLocation(Bing.Maps.Location)' has some invalid arguments
.
这似乎是一个很简单的问题,有一个很简单的解决方案,但我一直不知道是哪里出了问题。
编辑:证明我的位置指向必应。Maps的Location而不是我的命名空间中的另一个Location类:https://i.stack.imgur.com/Vxd6z.png.
错误图片:https://i.stack.imgur.com/El1C1.png.
<>之前错误3 'object'不包含带2个参数的构造函数C:'…' latlong .cs 16 15 MapTest . C错误4名称"纬度"在当前上下文中不存在C:'…'LatLon.cs 36 21 MapTest错误5 'MapTest。LatLon'不包含'Latitude'的定义,也没有扩展方法'Latitude'接受类型为'MapTest '的第一个参数。可以找到LatLon'(您是否缺少using指令或汇编引用?)C:'…' laton .cs 36 35 MapTest错误6名称"经度"在当前上下文中不存在C:'…'LatLon.cs 36 49 MapTest错误7 'MapTest。LatLon'不包含'Longitude'的定义,也没有扩展方法'Longitude'接受类型为'MapTest '的第一个参数。可以找到LatLon'(您是否缺少using指令或汇编引用?)C:'…' latlong .cs 36 64 MapTest名称"纬度"在当前上下文中不存在C:'…'LatLon.cs 48 21 MapTest错误9 'MapTest。LatLon'不包含'Latitude'的定义,也没有扩展方法'Latitude'接受类型为'MapTest '的第一个参数。可以找到LatLon'(您是否缺少using指令或汇编引用?)C:'…' laton .cs 48 35 MapTest错误10名称"经度"在当前上下文中不存在C:'…'LatLon.cs 48 49 MapTest错误11 'MapTest。LatLon'不包含'Longitude'的定义,也没有扩展方法'Longitude'接受类型为'MapTest '的第一个参数。可以找到LatLon'(您是否缺少using指令或汇编引用?)C:'…' latlong .cs 48 64 MapTest名称"纬度"在当前上下文中不存在C:'…'LatLon.cs 54 37 MapTest名称"经度"在当前上下文中不存在C:'…' latlong .cs 55 37 MapTest最佳重载方法匹配'MapTest. mainpage . getbinnedlocation (Bing.Maps.Location)'有一些无效参数C:'…' mainpage . example .cs 75 25 MapTest. getbinnedlocation (Bing.Maps.Location)错误15参数1:无法从"MapTest"转换。从伦敦到bing,地图。位置"C:'…' mainpage . example .cs 75 43 MapTest最佳重载方法匹配'MapTest. mainpage . getbinnedlocation (Bing.Maps.Location)'有一些无效参数C:'…' mainpage . example .cs 76 25 MapTest. getbinnedlocation (Bing.Maps.Location)错误17参数1:无法从"MapTest"转换。从伦敦到bing,地图。位置' C:'…' mainpage . example .cs 76 43 MapTest错误18 'MapTest。LatLon'不包含'Latitude'的定义,也没有扩展方法'Latitude'接受类型为'MapTest '的第一个参数。可以找到LatLon'(您是否缺少using指令或汇编引用?)C:'…' mainpage . example .cs 79 40 MapTest错误19 'MapTest。LatLon'不包含'Longitude'的定义,也没有扩展方法'Longitude'接受类型为'MapTest '的第一个参数。可以找到LatLon'(您是否缺少using指令或汇编引用?)C:'…' mainpage . example .cs 79 61 MapTest错误20 'MapTest。LatLon'不包含'Latitude'的定义,也没有扩展方法'Latitude'接受类型为'MapTest '的第一个参数。可以找到LatLon'(您是否缺少using指令或汇编引用?)C:'…' mainpage . example .cs 80 40 MapTest错误21 'MapTest。LatLon'不包含'Longitude'的定义,也没有扩展方法'Longitude'接受类型为'MapTest '的第一个参数。可以找到LatLon'(您是否缺少using指令或汇编引用?)C:'…' mainpage . example .cs 80 61 MapTest您的LatLon类有一些问题可能会导致您的问题。看看修复这些问题是否能修复你的代码。
- 创建自己的Latitude和Logitude成员。你不应该创建自己的,你应该使用底层类的成员,你可以通过
base(
调用底层类的构造函数。 -
getBinnedLocation
返回new Location
,但您将其转换为LatLon
,这将在运行时失败。只需调用new LatLon
,并让它返回LatLon
而不是Location
。 - 你的函数使用java的命名风格,c#有自己的风格(不是错误,但你应该遵循你正在编写的语言的约定)。函数应该是
PascalCased
而不是camelCased
.
class LatLon : Location
{
//Get rid of these
//public readonly double Latitude;
//public readonly double Longitude;
public LatLon(double latitude, double longitude)
: base(latitude, longitude) //This calls the base's (double, double) constuctor.
{
}
//... Everything else can stay the same
}
LatLon l1 = GetBinnedLocation(new LatLon(41, -51.000001));
...
private LatLon GetBinnedLocation(Location loc)
{
return new LatLon(
getBinnedCoord(loc.Latitude, true),
getBinnedCoord(loc.Longitude, false));
}
更新:
感谢你更新的问题,确实你得到你的问题(错误15)的原因是错误1-14阻止你的类编译。修复1-14会修复你的错误。
从你的描述中,听起来VS对类型感到困惑。它的作用就好像Location不是一个已定义的类型。尝试删除定义该类型的dll引用,然后重新添加它。
在将LatLon实例发送给接受位置的函数时将其强制转换为Location