При реализации динамической рассылки с использованием dynamic
в общем классе, а параметр generic type является частным внутренним классом в другом классе, связующее средство времени выполнения генерирует исключение.
Например:
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<T>
не может получить доступ. Поэтому CallDispatch
должен быть недоступен - но это не так, потому что он доступен как T
.
Является ли это ошибкой с dynamic
, или это не должно поддерживаться?