[英]Contravariance interface implementation order
拿這段代碼:
using System;
public class Program
{
interface IVisitable<T> {
void Accept(object o);
}
interface IVisitor<in T> {
void Visit(T t);
}
class IntAndDoubleVisitable: IVisitable<int>, IVisitable<double>
{
public void Accept(object o) {
if (o is IVisitor<IntAndDoubleVisitable>) {
((IVisitor<IntAndDoubleVisitable>)o).Visit(this);
}
}
}
class SingleVisitor<T>: IVisitor<T> {
public void Visit(T visitor) {
Console.WriteLine(typeof(T).FullName);
}
}
class DoubleVisitor1: IVisitor<IVisitable<int>>, IVisitor<IVisitable<double>> {
void IVisitor<IVisitable<int>>.Visit(IVisitable<int> t) {
Console.WriteLine("Int");
}
void IVisitor<IVisitable<double>>.Visit(IVisitable<double> t) {
Console.WriteLine("Double");
}
}
class DoubleVisitor2: IVisitor<IVisitable<double>>, IVisitor<IVisitable<int>> {
void IVisitor<IVisitable<int>>.Visit(IVisitable<int> t) {
Console.WriteLine("Int");
}
void IVisitor<IVisitable<double>>.Visit(IVisitable<double> t) {
Console.WriteLine("Double");
}
}
public static void Main()
{
var visitable = new IntAndDoubleVisitable();
visitable.Accept(new SingleVisitor<IVisitable<int>>()); // Fine
visitable.Accept(new SingleVisitor<IVisitable<double>>()); // Fine
visitable.Accept(new DoubleVisitor1()); // ?
visitable.Accept(new DoubleVisitor2()); // ?
}
}
最少的兩個電話將如何處理?
通過進行一些測試,我可以說第一個調用 (DoubleVisitor1) 寫入“Int”,第二個寫入“Double”,但除了 Eric Lippert 的一篇文章,我在網上找不到任何東西,他開玩笑說如果相同的情況會導致什么在 IEnumerable 中使用。 最好能從語言或 Microsoft 文檔中獲得參考。
在 IL 級別,行為在 ECMA 335 (II.12.2) 中定義為按照聲明順序引用 IL 聲明表。 但是,AFAIK C# 並不正式保證將接口聲明順序從 C# 保留到 IL中,因此:
partial class
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.