在我的C#代码中,我可以访问MyNamespace.Exception
和System.Exception
。当我想要捕获其中一个例外时,理想情况下,我完全符合我想要捕获哪一个或使用别名来说清楚。但是,我担心只需键入catch(Exception)
即可。我假设编译器会将其标记为不明确的名称,但事实并非如此。它总是假设我想要一个MyNamespace.Exception
,如果我打算使用System.Exception
,那么很明显会为许多例外留下漏洞。这不仅仅是Exception
的问题,我也有例外MyNamespace.ArgumentException
。
所以我的问题是为什么编译器不会抱怨模糊的异常类型?另外,你会如何防止这个问题?
答案 0 :(得分:9)
为什么编译器不会抱怨模糊的异常类型?
可能是因为你说的方式并不含糊。如果你说:
using MyNamespace;
using System;
class P
{
void M()
{
try { ... } catch(Exception) { ... }
那么它将是模棱两可的,因为不清楚哪个“使用”指令是相关指令;两者都可以发挥作用。
如果你说
using System;
namespace MyNamespace
{
class P
{
void M()
{
try { ... } catch(Exception) { ... }
然后它不含糊;当前命名空间中的内容优先于using指令导入的内容。
你会如何防止这个问题?
我不会首先考虑这种情况。将您的类型命名为与常见系统类型相同是令人困惑,危险并且违背良好的设计原则。
答案 1 :(得分:2)
当前命名空间中的类型优先于其他类型。
答案 2 :(得分:1)
这种情况发生的原因与C#编译器解析名称的方式有关。简而言之,它更喜欢当前名称空间中存在的名称与导入的名称空间中的名称。
防止此问题的第一步是不定义与System
命名空间中的类型具有相同名称的类型。这样做只会导致潜在的模糊名称(对开发人员而言)。而是选择明确的名称,例如MyException
或MyArgumentException
。
答案 3 :(得分:0)
我不会将我的例外命名为Exception
。而是将其命名为其他内容(例如myException
)。