- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下源代码:
public abstract class SomeBaseClass {
public abstract void Foo(object a);
}
public class SomeClass<T> : SomeBaseClass {
public override void Foo(object a) {
Console.WriteLine("Foo() from SomeBaseClass");
}
public void Foo(T a) {
Console.WriteLine("Foo() from SomeClass");
}
}
由于 Foo
有两个重载,因此以下内容一点也不含糊:
public class Bar : SomeClass<int> { }
var bar = new Bar();
bar.Foo(null);
bar.Foo(24);
C# 语言规范是否说明了以下以某种方式编译的示例中的预期行为?
public class Baz : SomeClass<object> { }
var baz = new Baz();
baz.Foo(null); // "Foo() from SomeClass"
最佳答案
检查这个strange behavior explained by Jon Skeet in his blog post Overloading
Inheritance can cause a confusing effect. When the compiler goes looking for instance method overloads, it considers the compile-time class of the "target" of the call, and looks at methods declared there. If it can't find anything suitable, it then looks at the parent class... then the grandparent class, etc. This means that if there are two methods at different levels of the hierarchy, the "deeper" one will be chosen first, even if it isn't a "better function member" for the call. Here's a fairly simple example:
using System;
class Parent
{
public void Foo(int x)
{
Console.WriteLine("Parent.Foo(int x)");
}
}
class Child : Parent
{
public void Foo(double y)
{
Console.WriteLine("Child.Foo(double y)");
}
}
class Test
{
static void Main()
{
Child c = new Child();
c.Foo(10);
}
}The target of the method call is an expression of type Child, so the compiler first looks at the Child class. There's only one method there, and it's applicable (there's an implicit conversion from int to double) so that's the one that gets picked. The compiler doesn't consider the Parent method at all.
The reason for this is to reduce the risk of the brittle base class problem, where the introduction of a new method to a base class could cause problems for consumers of classes derived from it. Eric Lippert has various posts about the brittle base class problem which I can highly recommend.
There's one aspect of this behaviour which is particularly surprising though. What counts as a method being "declared" in a class? It turns out that if you override a base class method in a child class, that doesn't count as declaring it. Let's tweak our example very slightly:
using System;
class Parent
{
public virtual void Foo(int x)
{
Console.WriteLine("Parent.Foo(int x)");
}
}
class Child : Parent
{
public override void Foo(int x)
{
Console.WriteLine("Child.Foo(int x)");
}
public void Foo(double y)
{
Console.WriteLine("Child.Foo(double y)");
}
}
class Test
{
static void Main()
{
Child c = new Child();
c.Foo(10);
}
}Now it looks like you're trying to call Child.Foo(int x) in my opinion - but the above code will actually print Child.Foo(double y). The compiler ignores the overriding method in the child.
Given this oddness, my advice would be to avoid overloading across inheritance boundaries...
关于c# - C# 语言规范是否指定是使用方法覆盖还是使用影子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31310541/
我正在尝试创建一个邻接列表,为此我需要创建一个链接列表的数组列表。当我这样做时,这个 cityList 的大小不会更改为构造函数中传递的大小。我觉得这可能是由于阴影造成的,但我不确定阴影是如何工作的,
我正在包装应用程序的影子 jar 。该应用程序使用kotlin和一些外部依赖项。所有依赖项都在我的jar中,但在运行时出现以下异常: java.lang.NoSuchMethodError: java
我有两个自定义元素 #shadow-root (open) 我正在尝试设计 像这样: #desktop::shadow desktop-window { backgro
通过此实例化的 Web 组件样式不正确: connectedCallback() { const shadowRoot = this.attachShadow({ mode: 'open' });
规范在这里 - https://drafts.csswg.org/css-scoping/#slots-in-shadow-tree有注释如下。 Note: A non-obvious result
我在我的应用程序中使用网络组件。在 Web 组件中,我需要插入一个 React 组件。 Web Component 有 Shadow DOM。当我尝试使用以下方法渲染 react 组件时,出现错误。
CSS Scoping说 The descendants of a shadow host must not generate boxes in the formatting tree. Instea
在尝试比较两个 dll 的 API 更改时,一位同事注意到某些类有两个 GetType() 方法。 经过更深入的检查,结果是 System.Exception 隐藏了 GetType(): // th
HTML代码: #shadow-root (user-agent) "this is text in textarea" 我正在尝试使用此 JQuery 使用 id="in
我正在使用 Robolectric 并尝试创建 GoogleApiClient 的 Shadow 对象,但没有成功。 Shadow 类中的方法永远不会被调用。 GoogleApiClient 是接口(
我正在尝试寻找一种不使用 iframe 来封装 Javascript 的方法。理想情况下,我想要一种在父页面上加载外部 HTML 组件(小部件)的方法,而无需使用 iframe 附带的两步加载过程(首
我是Gradle和Shadow jar(Gradle version of Maven's Shade plugin)的新手。我正在构建一个胖jar,我想在其中合并服务文件(这就是为什么我首先使用影子
如您所见,我想动态添加内容,但 shadow DOM 不显示内容 我怎样才能使内容可见?我想让内容可见。 let shadow = document.querySelector('#nameTag')
我正在编写一个 chrome 扩展程序,它可以在页面加载或更改时修改元素属性。 我使用 Mutation Observer 执行此操作。然而,当加载/更改 shadow-dom(即嵌入的 twitte
我试图了解单选按钮如何在影子 dom 中工作。我有一个脚本标签,我将一个影子 DOM 附加到一个元素,然后附加一些单选按钮。我的问题是单选按钮未呈现。 Title Radi
我读了很多关于 shadow DOM 的文章,但对此不是很清楚。能谁能告诉我什么是 shadow DOM 以及如何为下面的代码添加一个? 最佳答案 Shadow DOM
关于 的 CSS 优先级规则是怎么说的?影子 DOM 中的标签? 我有一个元素 , 中包含的 CSS 文件与: component { display: inline-block; }
如果我的 Web 组件是 的直接子组件,我必须对它应用特殊的 CSS 样式。元素。到目前为止,这是我尝试过的: /* applies even if the component isn't a di
我尝试使用 https://github.com/webcomponents/webcomponentsjs 中的 polyfill 制作我自己的 Web 组件 这是我的代码: im-list.htm
我是一名优秀的程序员,十分优秀!