3 回答

TA貢獻1757條經驗 獲得超7個贊
以下應該工作
public static class MyClass
{
public static void MyMethod<T>(T t) where T : class
{
t.ToString(); // Note: for this to work we need to KNOW the type which defines `method`.
}
}
還有這個:
public class MyBase
{
void Method();
}
public static class MyClassForBase
{
public static void MyMethod<T>(T t) where T : MyBase
{
t.Method(); // Note: anything from MyBase is now available
}
}
最后但并非最不重要的一點是,您可以像這樣使用后期綁定
public static class MyClassDynamic
{
public static void MyMethod(dynamic t)
{
t.Method(); // Note: if t doesn't have a `Method` defined, the code will crush-n-burn at runtime
}
}

TA貢獻1865條經驗 獲得超7個贊
在采用泛型參數(shù)的方法中,您只能在該參數(shù)上調用編譯器知道將存在的方法。
在您的示例中:
void func<T>(T t)
{
t.method();
}
編譯器不知道該方法method存在,所以這不起作用。
您可以通過使用約束來告訴編譯器哪些方法可用。例如,如果該方法是在接口上定義的,那么您可以使用where如下子句正確約束它:
pubic interface IClassWithMethod
{
void method();
}
void func<T>(T t) where T : IClassWithMethod
{
t.method();
}

TA貢獻1828條經驗 獲得超3個贊
C# 中的泛型與 C++ 中的模板不同。C++ 模板本質上是在編譯時應用于代碼的宏,具體取決于它們所使用的類型。所以如果你試圖在一個沒有.method()方法的類上使用你的模板,它會在編譯時失敗。
相反,C# 泛型要求任何類型T 都必須定義泛型方法使用的任何方法和屬性。因此,如果您有一個定義.method()方法的基本類型或接口,您可以將泛型方法限制為該類型:
void func<T>(T t) where T:IHaveMethod
{ t.method(); }
只要IHaveMethod接口定義了method(),泛型函數(shù)就會編譯。請注意,在您的具體示例中,通用方法是無用的,因為您可以只調用method接口類型。
當您希望返回類型基于輸入類型時,泛型更有用:
T func<T>(T t) where T:IHaveMethod
{ t.method(); return t;}
現(xiàn)在,不僅method被調用,而且返回類型正是泛型參數(shù)的類型,而不僅僅是 an IHaveMethod,這可能會限制您可以在不強制轉換的情況下使用 return 執(zhí)行的操作。
最重要的是,不要像看待 C++ 模板那樣看待泛型。有一些非常根本的差異會讓您更難看出何時何地可以/應該使用泛型。
- 3 回答
- 0 關注
- 145 瀏覽
添加回答
舉報