Является ли это динамической ошибкой?

При реализации динамической диспетчеризации с использованием dynamic в универсальном классе, а параметр универсального типа является частным внутренним классом в другом классе, связыватель времени выполнения выдает исключение.

Например:

using System;

public abstract class Dispatcher<T> {
    public T Call(object foo) { return CallDispatch((dynamic)foo); }

    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<CallType> {
        protected override CallType CallDispatch(int foo) {
            return CallType.Int;
        }

        protected override CallType CallDispatch(string foo) {
            return CallType.String;
        }
    }

    private enum CallType { Int, String }
}

Здесь RuntimeBinderException будет выдано с сообщением

'Dispatcher.CallDispatch (int)' недоступен из-за уровня защиты

Причина недоступности заключается в том, что параметр типа T является частным CallType , к которому Dispatcher не может получить доступ . Следовательно, CallDispatch должен быть недоступен, но это не так, потому что он доступен как T .

Это ошибка с динамическим , или это не должны поддерживаться?

12
задан configurator 30 May 2011 в 11:01
поделиться