【发布时间】:2011-05-30 10:13:48
【问题描述】:
当在泛型类上使用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是Dispatcher<T>无法访问的私有CallType。因此,CallDispatch 必须是不可访问的 - 但事实并非如此,因为它可以作为 T 访问。
这是dynamic 的错误,还是不应该支持?
【问题讨论】:
-
鉴于这是一个部分类,问题可能出在其他地方(因为显然这不是唯一的文件)。
-
Alxandr:这是唯一的文件。部分存在是因为我之前将它用作部分类并且忘记删除它。
-
我不认为这是一个错误。我推测出于您的代码所展示的确切原因,事情被设为私有 - 不应该在不应该的地方被调用。
-
我在 Connect 上打开了一个查询:connect.microsoft.com/VisualStudio/feedback/details/672411/…
标签: c# dynamic compiler-bug