我想定义一栋有多个(特殊和普通)房间的房子,每个房间都有(特殊和普通)东西的集合。
我开始为ThingCollection(和派生类)使用泛型,但是当我想定义房间类型时,我的泛型类型定义开始出现错误。
有人知道定义接口/类的正确方法,这样我不会收到此错误消息吗?
代码:
namespace City.Street.House
{
// Thing(s)
public interface IThing{ }
public interface ISpecialThing : IThing { }
// Collection(s)
public interface ThingCollection<TThing> where TThing : IThing { }
public interface SpecialThingCollection<TThing> : ThingCollection<TThing> where TThing : ISpecialThing { }
// Room(s) // Error On TThing in both rows below:
public interface Room<TThingCollection> where TThingCollection : ThingCollection<TThing> { }
public interface SpecialRoom<TThingCollection> : Room<TThingCollection> where TThingCollection : SpecialThingCollection<TThing> { }
// House(s)
public interface House { }
}
错误消息:
CS0246 :找不到类型或名称空间名称“ TThing”(您是否缺少using指令或程序集引用?)
答案 0 :(得分:1)
除非在方法的签名中也定义了TThing
作为泛型约束中的类型参数,否则Room<TThingCollection>
应该成为Room<TThingCollection, TThing>
-
但这要起作用,您需要添加更多约束:
public interface Room<TThingCollection<TThing>>
where TThingCollection : ThingCollection<TThing>
where TThing : IThing
{ }
public interface SpecialRoom<TThingCollection<TThing>> : Room<TThingCollection>
where TThingCollection : SpecialThingCollection<TThing>
where TThing : ISpecialThing
{ }
或者您可以使用已声明为通用约束的接口(将TThing
更改为IThing
和ISpecialThing
:
// Room(s)
public interface Room<TThingCollection> where TThingCollection : ThingCollection<IThing> { }
public interface SpecialRoom<TThingCollection> : Room<TThingCollection> where TThingCollection : SpecialThingCollection<ISpecialThing> { }
答案 1 :(得分:0)
@Zohar您给出的答案使我稍微重构了代码。
我使用了这段代码:
ias.on('loaded', function(data, items) {
var title = data.match(/<title[^>]*>([^<]+)<\/title>/)[1];
document.title = title.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, "'");
})
我还必须将collections接口更改为此:
// Room(s)
public interface Room<TThingCollection> where TThingCollection : ThingCollection<IThing> { }
public interface SpecialRoom<TThingCollection> : Room<TThingCollection> where TThingCollection : SpecialThingCollection<ISpecialThing> { }
没有这些集合更改,将无法正常工作。
非常感谢您的帮助!