Is this a bug in dynamic?

前端 未结 2 567
暗喜
暗喜 2021-02-07 21:32

When implementing dynamic dispatch using dynamic on a generic class, and the generic type parameter is a private inner class on another class, the runtime binder th

2条回答
  •  清酒与你
    2021-02-07 21:57

    It's a bug. If you can make the call statically (and you can), you should be able to make it dynamically.

    Specifically, the following code works:

    using System;
    
    public abstract class Dispatcher {
        public T Call(object foo)
        {
            return CallDispatch(((object)(dynamic)foo).ToString());
        }
    
        protected abstract T CallDispatch(int foo);
        protected abstract T CallDispatch(string foo);
    }
    
    public class Program {
        public static void Main() {
            TypeFinder d = new TypeFinder();
    
            Console.WriteLine(d.Call(0));
            Console.WriteLine(d.Call(""));
        }
    
        private class TypeFinder : Dispatcher {
            protected override CallType CallDispatch(int foo) {
                return CallType.Int;
            }
    
            protected override CallType CallDispatch(string foo) {
                return CallType.String;
            }
        }
    
        private enum CallType { Int, String }
    }
    

    Note that I've used ToString() to make the static type known, the C# compiler and CLR allow this context to access the private type CallType, so the DLR should allow it as well.

提交回复
热议问题