2010-06-03 82 views
2

我有以下通用方法:代碼分析警告CA1004與泛型方法

// Load an object from the disk 
public static T DeserializeObject<T>(String filename) where T : class 
{ 
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

    try 
    { 
     TextReader textReader = new StreamReader(filename); 
     var result = (T)xmlSerializer.Deserialize(textReader); 
     textReader.Close(); 
     return result; 
    } 
    catch (FileNotFoundException) 
    { } 

    return null; 
} 

我編譯時得到以下警告:
CA1004:Microsoft.Design:考慮設計,其中「MiscHelpers.DeserializeObject (字符串)'在任何調用中都不需要顯式類型參數'T'。

我已經考慮過這一點,我不知道一種方法來執行它所要求的限制可以反序列化的類型。我坦率地承認,我可能錯過了一個簡單的方法來解決這個問題。

但是,如果我不是,那麼我唯一的辦法就是壓制這個警告嗎?我有一個乾淨的項目,沒有任何警告或消息。我想保持這種方式。

我猜我在問「爲什麼這是警告?」充其量,這似乎應該是一個信息。即使這似乎有點多。它可以或不能被修復。如果它不能,那麼你只是停留在沒有追索權的警告之下,而是壓制它。我錯了嗎?

+0

這是一個代碼分析警告,而不是編譯器警告。 – SLaks 2010-06-03 14:36:27

+2

+1用於運行代碼分析。如果更多人這樣做,世界(或者至少它的代碼)會是一個更好的地方。 – SLaks 2010-06-03 14:42:56

回答

7

由於您在返回類型中使用T,這是誤報。

它在VS2010的代碼分析中得到修復。

2

這是一個公平的使用警告。麻煩的是,編譯器無法從方法調用中推導出類型參數。賦值語句的左側是而不是考慮過。例如:

class Example { 
    public T Method1<T>() { 
     return default(T); 
    } 
    public T Method2<T>(T arg) { 
     return arg; 
    } 

    public void Test() { 
     int value1 = Method1();  // CS0411 
     int value2 = Method1<int>(); // OK 
     int value3 = Method2(42);  // Inferred, no problems 
    } 
    } 

請注意,必須通過顯式指定類型參數來調用Method1。沒關係,但使用這種方法更加困難。這就是CA1002是使用警告的原因。 Method2沒有這個問題,編譯器可以自動推斷出type參數必須是參數類型的整數。

兩種可能的方式,你可以應用此你的方法:

public static void DeserializeObject<T>(String filename, out T result) where T : class { 
    // etc.. 
} 

public static T DeserializeObject<T>(String filename, T defaultValue) where T : class { 
    // etc... 
} 

不那麼肯定這是更好的解決方案,雖然吞嚥異常並返回NULL並不要麼贏大獎。這是由你來打電話。