将派生类作为参数传递给用于基类参数的方法-得到错误

本文关键字:方法 参数 错误 基类 用于 派生 参数传递 | 更新日期: 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类有一些问题可能会导致您的问题。看看修复这些问题是否能修复你的代码。

  1. 创建自己的Latitude和Logitude成员。你不应该创建自己的,你应该使用底层类的成员,你可以通过base(调用底层类的构造函数。
  2. getBinnedLocation返回new Location,但您将其转换为LatLon,这将在运行时失败。只需调用new LatLon,并让它返回LatLon而不是Location
  3. 你的函数使用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