2012-04-19 124 views
1

我有以下的類和方法:如何在泛型的where子句中指定泛型類?

public class MyGenericClass<T> 
    where T : class 
{ 
} 

public class MyClass 
{ 
    public TGen MyMethod<TGen>(TGen myGenClass) 
     where TGen : MyGenericClass<T> 
     where T : class 
    { 
     return myGenClass; 
    } 
} 

然而,這給出了一個錯誤,因爲它無法化解的MyMethod符號T。我寧願不必有MyMethod<TGen, T>,因爲它對我來說似乎有點多餘。這可能嗎?

+2

但是'MyMethod'中沒有'T'類型的參數。我不明白你想要做什麼。 – 2012-04-19 16:01:44

+0

我想有'公共TGen MyMethod (TGen myGenClass)其中TGen:MyGenericClass <>' – cm007 2012-04-19 16:03:01

+0

我再次,我不明白你想用'MyGenericClass <>'傳達什麼。你爲什麼認爲'MyGenericClass'的類型參數會以任何方式被推斷?推斷出什麼? – 2012-04-19 16:04:01

回答

2

如果你希望能夠使用任何MyGenericClass實現您TGen類型,那麼你需要創建要使用的MyGenericClass實現的基類(當然,這限制了您將爲您的TGen實例獲得的功能。

public class MyGenericClassBase { } 
public class MyGenericClass<T> : MyGenericClassBase { } 
public class MyClass<TGen> 
     where TGen: MyGenericClassBase 
{ 
    // Stuff 
} 
1

聽起來像是你只是忘記包括T在泛型類型的該方法的列表:

public TGen MyMethod<TGen, T>(TGen myGenClass) 
    where TGen : MyGenericClass<T> 
    where T : class 
{ 
    return myGenClass; 
} 
3

您必須指定T之前,你可以在定義中使用它。編譯器無法知道什麼是T

所以你之前使用它(在方法級別,如下,或者在一流水平MyClass),你應該指定T

public class MyClass 
{ 
    public TGen MyMethod<TGen, T>(TGen myGenClass) 
     where TGen : MyGenericClass<T> 
     where T : class 
    { 
     return myGenClass; 
    } 
} 

你也可以使用一個具體的實現泛型類型在哪裏條款:

public class MyClass 
{ 
    public TGen MyMethod<TGen>(TGen myGenClass) 
     where TGen : MyGenericClass<DateTime> 
    { 
     return myGenClass; 
    } 
}