http://stackoverflow.com/a/8086788可以讓c#產生編譯時錯誤,但是這樣的函數沒辦法用c#寫。


C#語法上是不允許的,詳見C# language specification,第406頁。
C# 做不到,但是.net 支持,可以考慮用C++/cli 或者F#實現在庫里。
pulic class TypeRequiresAnEnum&{ static TypeRequiresAnEnum(){

if(!typeof(T).IsEnum){

throw new ArgumentException("T must be an enumerated type"); } }}

在泛型類型上定義一個靜態構造器的目的是保證傳遞的類型實參滿足特定的條件。

以上來自: CLR via C#

升級到C#7.3以上版本,即可使用 where T : System.Enum


如果只是讓使用者知到,這裡要限定一個Enum,可以吧defaultValue的類型改為Enum,這樣就可以讓使用者直到這裡需要傳遞一個Enum類型了。

static T Convert2Enum&(object item, Enum defaultValue) where T : struct, IComparable, IFormattable, IConvertible
{
return (T)((Enum.TryParse(defaultValue.GetType(), item?.ToString(), true, out object t)) ? t : defaultValue);
}


推薦閱讀:
相关文章