[英]How to specify in C# generics such T that is constructible from string? (generic type constraint)
[英]C# generics: what's the point of the “X<T> where T: X<T>” generic type constraint?
讀一本書: NHibernate 3:初學者指南我發現了一個令我好奇的片段:
行動時間 - 創建基礎實體
(......)
- 將新類添加到項目的文件夾域,並將其命名為Entity。 在T中使類成為抽象和泛型。您的代碼應類似於以下代碼片段:
using System;
namespace OrderingSystem.Domain
{
public abstract class Entity<T> where T : Entity<T>
{ }
}
我的問題是: where T : Entity<T>
的片段where T : Entity<T>
什么意義?
我知道where
部分可以應用於在類型T
上添加約束 ,但上面的代碼看起來似乎永遠不可能實例化這樣的類(如果它不是抽象的話)。
這很可能意味着為返回(或接收)更多派生類型的實例的方法提供額外的類型安全性,從而使調用者不必將結果轉換為更派生的類型。
abstract class Cloneable<T> where T : Cloneable<T>
{
public abstract T Clone();
}
sealed class MyCloneable : Cloneable<MyCloneable>
{
public override MyCloneable Clone()
{
return new MyCloneable();
}
}
MyCloneable instance = new MyCloneable();
MyCloneable clone = instance.Clone();
編輯
根據@ siride的評論,這被稱為奇怪的重復模板模式。 Eric Lippert撰寫了一篇關於它在C#中的應用的精彩文章:
https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/
PS並且只是為了說明如果你要刪除泛型約束,上面的例子會是什么樣子:
abstract class Cloneable
{
public abstract Cloneable Clone();
}
sealed class MyCloneable : Cloneable
{
public override Cloneable Clone()
{
return new MyCloneable();
}
}
MyCloneable instance = new MyCloneable();
MyCloneable clone = (MyCloneable)instance.Clone(); // Note the cast.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.