Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当存在两个同名类型时,如何消除监视窗口中类型的歧义_C#_Visual Studio 2010 - Fatal编程技术网

C# 当存在两个同名类型时,如何消除监视窗口中类型的歧义

C# 当存在两个同名类型时,如何消除监视窗口中类型的歧义,c#,visual-studio-2010,C#,Visual Studio 2010,在“监视”窗口中,我试图查看TaskScheduler.Current,但它显示以下错误: The type 'System.Threading.Tasks.TaskScheduler' exists in both 'CommonLanguageRuntimeLibrary' and 'System.Threading.dll' 我的计划也是如此,因为: 这是一个.NET 4.0 exe,它使用mscorlib(CommonLanguageUntimeLibrary)中的任务调度程

在“监视”窗口中,我试图查看
TaskScheduler.Current
,但它显示以下错误:

The type 'System.Threading.Tasks.TaskScheduler' exists in both 
'CommonLanguageRuntimeLibrary' and 'System.Threading.dll'   
我的计划也是如此,因为:

  • 这是一个.NET 4.0 exe,它使用mscorlib(CommonLanguageUntimeLibrary)中的
    任务调度程序
  • dll是通过后期绑定引入的,它引用了旧的反应式扩展.NET 3.5 System.Threading.dll,该扩展在同一命名空间中也有
    TaskScheduler
问题:我可以在调试器中使用什么语法来指定要检查的
TaskScheduler
的dll


旁白:我假设将这两个同名类型引入同一个可执行文件中没有问题(即没有未定义的行为),对吗?

我不确定这是否可以通过“监视”窗口工作(但我不明白为什么不应该,谁知道呢)-但消除具有相同类型的两个dll-s之间歧义的方法是使用
外部别名

这与
全局::
是一样的,只是在本例中可以使用它来指定dll别名

您可以通过自己在dll上设置/定义别名来使用它 引用(我认为属性中有别名字段)

我不确定这是否完全适用于您的案例,即您是否能够做到这一点,但您必须在您自己的案例中进行尝试

编辑:(基于评论)

鉴于具体情况,我在调试器中尝试了它。因为另一个是后期绑定,所以编译器不知道它(当然,因为它不会工作)

因此,在您的源代码(.cs,您无论如何都需要进行监视)的顶部添加

using mysystem = global::System.Threading.Tasks.TaskScheduler;  
然后在watch
mysystem.Current
(我以我的示例为基础)

或者

using mytasks = global::System.Threading.Tasks;  
还有
mytasks.TaskScheduler
——哪一个真的不重要

EDIT2:
出于历史原因,我确认代码编辑是不可避免的

1) 从项目中删除
mscorlib
——项目、设置、生成、高级

2) 手动卸载和编辑项目配置-添加mscorlib引用(不允许通过VS添加)。此外,WPF应用程序还需要另一个修复程序(此处超出范围)

3) 为mscorlib添加别名-您可以添加多个别名,分别使用w/
,效果很好

4) 添加外部别名

从那时起,您可以在debugger中引用它-但是没有办法放弃手动
代码编辑
。此外,外部别名是按“建筑单位”,即文件,因此没有全局性

简言之,这是我们能做的最好的了,伊姆霍


以及@JaredPar对此的确认

有趣的问题!不应该有任何歧义;对类型的引用都通过包含程序集进行限定。但我不知道是否有任何方法可以限定调试器中的引用……我没有任何
外部别名。我直接引用mscorlib。System.Threading.dll通过后期绑定进入。考虑到这一点,现在还不清楚您建议我在监视窗口中键入什么来消除歧义。请尝试
global::
-您至少可以在代码中执行以下操作
var current=global::System.Threading.Tasks.TaskScheduler.current。我仍然不知道另一个dll是否会干扰它。啊,我明白了。好的,我尝试了
global::System.Threading.Tasks.TaskScheduler
,但收到了相同的错误消息。这对我来说很有意义,因为它们都在全局名称空间中(因为它们不是通过
外部别名
)好的,将到达那里:)-这里是另一个-我在我的调试器中尝试了它。因为另一个是后期绑定,所以编译器不知道它(当然,因为它不会工作)。因此,在您的源代码(.cs,您仍然需要进行监视)的顶部添加,例如使用mysystem=global::System.Threading.Tasks.TaskScheduler。然后在watch
mysystem.Current
(我以我的例子为基础)。@MattSmith我认为按照这个答案中的详细说明解决这个问题是最接近你的。我找到了一个答案,并从JaredPar那里得到了一个非常明确的答案。