c# - 泛型方法继承 : VS and Xamarin Studio yield different results; which is right?

标签 c# generics inheritance mono overriding

在继承层次结构中,我实现了以下通用方法:

public class Base
{
    public virtual T Foo<T>()
    {
        Console.WriteLine("Base");
        return default(T);
    }
}

public class Derived : Base
{
    public override T Foo<T>()
    {
        Console.WriteLine("Derived");
        return default(T);
    }
}

public class DerivedDerived : Derived
{
    public override T Foo<T>()
    {
        base.Foo<string>();
        return default(T);
    }
}

这里的关键部分是,在 DerivedDerived 的方法实现中,我正在调用具有特定类型(string)的 base 类的方法>).

当我在 Visual Studio (2012) 或 LinqPad 中编译它并执行以下语句时:

var x = new DerivedDerived().Foo<string>();

输出是我直觉上期望的:

Derived

但是,如果我在 Xamarin Studio 4.0(Windows 或 Mac,在 Windows 上使用 .NET 或 Mono C# 编译和运行似乎无关紧要)中编译并运行相同的代码,输出为:

Base

这里的正确结果是什么?

C# 语言规范 5.0 的第 7.6.8 段包含以下声明:

When a base-access references a virtual function member (a method, property, or indexer), the determination of which function member to invoke at run-time (§7.5.4) is changed. The function member that is invoked is determined by finding the most derived implementation (§10.6.3) of the function member with respect to B (instead of with respect to the run-time type of this, as would be usual in a non-base access). Thus, within an override of a virtual function member, a base-access can be used to invoke the inherited implementation of the function member. If the function member referenced by a base-access is abstract, a binding-time error occurs.

乍一看,派生程度最高的实现(即 Derived.Foo)将从 DerivedDerived.Foo 调用,除非我以某种方式使继承短路通过在泛型方法调用中应用特定类型来实现层次结构?

最佳答案

正确的结果如下,从规范的写法就可以看出来。

Derived

编辑:规范说:

The function member that is invoked is determined by finding the most derived implementation (§10.6.3) of the function member with respect to B (instead of with respect to the run-time type of this, as would be usual in a non-base access).

DerivedDerived 的基类是Derived . Foo<T> 的最派生实现关于 DerivedDerived.Foo<T> .那是被调用的方法,而不是 Base.Foo<T> .

关于c# - 泛型方法继承 : VS and Xamarin Studio yield different results; which is right?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19449720/

相关文章:

c# - 如何消除 WebBrowser 闪烁?

java - 关于依赖共享的 Maven 多模块项目组合

java - 使用上限通配符时不兼容的类型

generics - F# 有通用算术支持吗?

Java Raw Type 和泛型交互

c++ - 重载派生类中的比较运算符权私有(private)继承

r - 继承自 data.frame 的 S4 对象:删除 dplyr::filter 中的警告

c# - 光标聚焦在 WPF/C# 中的文本框

c# - 如何在 C# 中从 file1 中删除 file2 中存在的行

c# - Selenium xPath 文本连接