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