[英]Why is catching “Exception” not ambiguous when I have System.Exception and MyNamespace.Exception?
在我的C#代碼中,我可以訪問MyNamespace.Exception
以及System.Exception
。 當我想要捕獲其中一個例外時,理想情況下,我完全符合我想要捕獲哪一個或使用別名來說清楚。 但是,我擔心只需鍵入catch(Exception)
。 我假設編譯器會將其標記為不明確的名稱,但事實並非如此。 它總是假設我想要一個MyNamespace.Exception
,如果我打算使用System.Exception
,那么很明顯會為許多異常留下漏洞而錯過捕獲。 這不僅僅是Exception
的問題,我還有MyNamespace.ArgumentException
等異常。
所以我的問題是為什么編譯器不會抱怨模糊的異常類型? 另外,你會如何防止這個問題?
為什么編譯器不會抱怨模糊的異常類型?
可能是因為你說的方式並不含糊。 如果你說:
using MyNamespace;
using System;
class P
{
void M()
{
try { ... } catch(Exception) { ... }
那么它是模棱兩可的,因為不清楚哪個“使用”指令是相關指令; 兩者都可以工作。
如果你說
using System;
namespace MyNamespace
{
class P
{
void M()
{
try { ... } catch(Exception) { ... }
然后它不含糊; 當前命名空間中的內容優先於using指令導入的內容。
你會如何防止這個問題?
我不會首先考慮這種情況。 將您的類型命名為與常見系統類型相同是令人困惑,危險並且違背良好的設計原則。
當前命名空間中的類型優先於其他類型。
這種情況發生的原因與C#編譯器解析名稱的方式有關。 簡而言之,它更喜歡當前名稱空間中存在的名稱與導入的名稱空間中的名稱。
防止此問題的第一步是不定義與System
命名空間中的類型具有相同名稱的類型。 這樣做只會導致潛在的模糊名稱(對開發人員而言)。 而是選擇明確的名稱,如MyException
或MyArgumentException
。
我不會將我的異常命名為Exception
。 而是將其命名為其他東西(如myException
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.