CA1903:只使用來自目標架構的 API
型別名稱 |
UseOnlyApiFromTargetedFramework |
CheckId |
CA1903 |
分類 |
Microsoft.Portability |
中斷變更 |
中斷 - 對外部可見成員或型別的簽章引發時。 非中斷 - 在方法主體中引發時。 |
原因
某一個成員或型別使用的是 Service Pack 中所含的成員或型別,但是專案的目標 Framework 中卻沒有包含該成員或型別。
規則描述
新成員和型別已包含在 .NET Framework 2.0 Service Pack 1 與 2、.NET Framework 3.0 Service Pack 1 與 2,以及 .NET Framework 3.5 Service Pack 1。以 .NET Framework 主要版本為目標的專案會無意間與這些新的 API 產生相依關係。為了避免產生這樣的相依關係,所使用的任一新成員及型別,只要不是專案目標 Framework 預設包含的範圍,便會引發這項規則。
目標 Framework 與 Service Pack 的相依性
當目標 Framework 為 |
使用下列版本中包含的成員時引發 |
.NET Framework 2.0 |
.NET Framework 2.0 SP1、.NET Framework 2.0 SP2 |
.NET Framework 3.0 |
.NET Framework 2.0 SP1、.NET Framework 2.0 SP2、.NET Framework 3.0 SP1、.NET Framework 3.0 SP2 |
.NET Framework 3.5 |
.NET Framework 3.5 SP1 |
.NET Framework 4 |
N/A |
若要變更專案的目標 Framework,請參閱以特定的 .NET Framework 版本或設定檔為目標。
如何修正違規
若要移除 Service Pack 上的相依性關係,請停止使用所有新成員或型別。如果這個相依性關係是刻意建立的,可以隱藏不要顯示警告或是關閉這個規則。
隱藏警告的時機
如果這並不是特定 Service Pack 上刻意建立的相依性,請不要隱藏這項規則的警告。在這種情況下,您的應用程式可能會因為沒有安裝這個 Service Pack 而無法在系統上執行。如果這個相依性關係是刻意建立的,可以隱藏不要顯示警告或是關閉這個規則。
範例
下列範例顯示的類別所使用的型別 DateTimeOffset 只有在 .NET 2.0 Service Pack 1 才有。這個範例中,[專案] 屬性其 [目標 Framework] 下拉式清單中的 .NET Framework 2.0 必須已選取。
using System;
namespace Samples
{
public class LibraryBook
{
private readonly string _Title;
private DateTimeOffset _CheckoutDate; // Violates this rule
public LibraryBook(string title)
{
_Title = title;
}
public string Title
{
get { return _Title; }
}
public DateTimeOffset CheckoutDate // Violates this rule
{
get { return _CheckoutDate; }
set { _CheckoutDate = value; }
}
}
}
以下範例修正了先前說明的違規,即使用 DateTime 型別來取代 DateTimeOffset 型別的問題。
using System;
namespace Samples
{
public class LibraryBook
{
private readonly string _Title;
private DateTime _CheckoutDate;
public LibraryBook(string title)
{
_Title = title;
}
public string Title
{
get { return _Title; }
}
public DateTime CheckoutDate
{
get { return _CheckoutDate; }
set { _CheckoutDate = value; }
}
}
}