簡體   English   中英

逆變接口實現順序

[英]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中,因此:

  • 今天正好申報單
  • 但謹慎的做法是認為這是一種未定義的行為,而不是依賴它
  • 特別是,請注意 C#無論如何都可以有未定義的聲明順序(參見: partial class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM