2011-05-02 68 views
19

我有一個泛型類,可以幫助我做參數檢查值C# - 靜態類型不能用作類型參數

internal sealed class Argument<T> 
    where T : class 
{ 
    private void TraceAndThrow(Exception ex) 
    { 
     new InternalTraceHelper<T>().WriteError(ex); 
     throw ex; 
    } 

    internal void ThrowNull(object value, string argName) 
    { 
     if (ReferenceEquals(value, null)) 
     { 
      TraceAndThrow(new ArgumentNullException(argName)); 
     } 
    } 

    internal void ThrowIf(bool condition, string argName) 
    { 
     if (condition) 
     { 
      TraceAndThrow(new ArgumentException(null, argName)); 
     } 
    } 


    internal void ThrowNotInEnum(Type enumType, object value) 
    { 
     if (!Enum.IsDefined(enumType, value)) 
     { 
      TraceAndThrow(new ArgumentOutOfRangeException(Resources.ArgEnumIllegalVal.InvariantFormat(value))); 
     } 
    } 
} 

但是,當我試圖用靜態類使用它:

internal static class Class1 
{ 
    private static Argument<Class1> _arg; 
} 

我得到這個錯誤(編譯):

靜態類型不能用作類型參數

我做錯了什麼?

回答

24

這是經過深思熟慮的。

靜態類試圖防止不恰當的使用,所以在幾乎所有情況下,在通常需要實例的類型...並且包含類型參數的情況下,不能使用它們。

請參閱C# 4 spec的10.1.1.3.1節,瞭解可以引用靜態類類型的非常有限的一些情況。

+0

做我的靜態類非靜態但具有私有構造函數將做這項工作?所以沒有人可以實現它,但是非靜態的。這是執行它的好方法嗎? (感謝該部分,我已閱讀它) – 2011-05-02 15:02:07

+0

@Arnaud F .:那麼會*工作* - 但你用什麼類型的參數?它有什麼意義呢?它看起來只是由'InternalTraceHelper'使用的,我們不知道那是什麼。 – 2011-05-02 15:04:13

+0

'InternalTraceHelper'做'Trace.Write()',參數類型用於定義跟蹤的類別。可以用'Trace.WriteLine(「消息」,typeof(T).FullName)替換; // Where T = Class1' – 2011-05-02 15:08:49

5

泛型僅適用於實例,不適用於靜態類。

+0

是否有解決方法?我如何管理它?我不會在靜態類中檢查「手動」,並且在非靜態類中使用'參數'... – 2011-05-02 14:50:56

+0

不,除了使用'System.Type'外沒有其他的東西。 – 2011-05-02 14:52:42

+0

@Arnaud,你不能傳遞靜態類型作爲參數,所以我沒有看到你什麼時候想要一個'參數',除非我被你的類名誤導。 – 2011-05-02 14:53:07

-1

你在做什麼錯誤是使用靜態類型作爲泛型類型參數。

1

由於無法實例化靜態類,因此它永遠不會使用靜態類型創建Argument<T>

0

由於靜態類不會有實例成員,所以我擔心的是我將與他們做什麼樣的事情。

我相信,由於錯過了不能使用靜態類作爲泛型參數,我相信你需要使用擴展方法而不是泛型類。

相關問題