он получает права доступа от типа среды выполнения, который будет 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Или это не должно поддерживаться?

 configurator02 июн. 2011 г., 13:12
Я открыл запрос на Connect:connect.microsoft.com/VisualStudio/feedback/details/672411/...
 Alxandr30 мая 2011 г., 12:26
Учитывая, что это частичный класс, проблема может лежать в другом месте (потому что, очевидно, это не единственный файл).
 configurator30 мая 2011 г., 13:02
Alxandr: это единственный файл. Частичное было там, потому что я использовал его как частичный класс и забыл удалить это.
 Antony Koch01 июн. 2011 г., 14:34
Я не думаю, что это ошибка. Я бы предположил, что все делается конфиденциально по точным причинам, которые демонстрирует ваш код - чтобы его нельзя было вызывать там, где его не должно быть.

Ответы на вопрос(0)

Ваш ответ на вопрос