При реализации динамической диспетчеризации с использованием 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
.
Это ошибка с динамическим
, или это не должны поддерживаться?