C# 向接口属性添加约束
我正在编写一个接口,我想声明一个返回泛型集合的属性。集合的元素应该实现一个接口。这可能吗?如果可能,语法是什么 这不是编译,正确的方法是什么C# 向接口属性添加约束,c#,generics,interface,C#,Generics,Interface,我正在编写一个接口,我想声明一个返回泛型集合的属性。集合的元素应该实现一个接口。这可能吗?如果可能,语法是什么 这不是编译,正确的方法是什么 interface IHouse { IEnumerable<T> Bedrooms { get; } where T : IRoom } 接口IHouse { IEnumerable卧室{get;}其中T:i房间 } 谢谢您还必须将界面标记为通用: interface IHouse<T> where T : IRoom
interface IHouse
{
IEnumerable<T> Bedrooms { get; } where T : IRoom
}
接口IHouse
{
IEnumerable卧室{get;}其中T:i房间
}
谢谢您还必须将界面标记为通用:
interface IHouse<T> where T : IRoom
{
IEnumerable<T> Bedrooms { get; }
}
接口IHouse,其中T:IRoom
{
IEnumerable卧室{get;}
}
您还必须将接口标记为通用:
interface IHouse<T> where T : IRoom
{
IEnumerable<T> Bedrooms { get; }
}
接口IHouse,其中T:IRoom
{
IEnumerable卧室{get;}
}
为什么要使用泛型?只要做:
interface IHouse
{
IEnumerable<IRoom> Bedrooms { get; }
}
接口IHouse
{
IEnumerable卧室{get;}
}
这更干净,而且由于您已经限制到接口,它的行为几乎相同。为什么要使用泛型?只要做:
interface IHouse
{
IEnumerable<IRoom> Bedrooms { get; }
}
接口IHouse
{
IEnumerable卧室{get;}
}
这更简洁,因为您已经限制了接口,它的作用几乎相同。泛型用于类和方法,而不是属性。如果类/接口是泛型的,则可以在属性中使用该类型。我同意里德的解决方案。泛型用于类和方法,而不是属性。如果类/接口是泛型的,则可以在属性中使用该类型。我同意里德的解决方案。微软没有充分的理由选择添加此限制。UndertheHood属性只是一对方法,并且已经支持泛型方法 我已经多次遇到这个限制,不得不求助于添加显式get和set方法:
interface IHouse
{
IEnumerable<T> GetBedrooms<T>() where T : IRoom;
}
接口IHouse
{
IEnumerable getBeddooms()其中T:IRoom;
}
微软没有充分的理由选择添加此限制。UndertheHood属性只是一对方法,并且已经支持泛型方法
我已经多次遇到这个限制,不得不求助于添加显式get和set方法:
interface IHouse
{
IEnumerable<T> GetBedrooms<T>() where T : IRoom;
}
接口IHouse
{
IEnumerable getBeddooms()其中T:IRoom;
}
想知道为什么我被否决了。此声明直接来自MSDN.+1-不仅仅是为了同意我的意见;)泛型约束对属性不起作用,这是有原因的。@ReedCopsey我想知道这是什么原因,因为知道属性无论如何都会解析为方法。@Marco泛型不仅仅对返回类型起作用-对于泛型方法,您需要在方法调用中指定泛型类型。泛型属性需要一种新的调用语法,这很奇怪,因为出于使用目的,属性看起来像字段。消除这种可用性可以使语言设计更干净,并且没有明显的副作用,因为您总是可以编写泛型方法。你怎么称呼这个?你会使用:var rooms=house.卧室代码>语法与其他任何东西都不一样。@ReedCopsey重点是属性被转换为方法,因此没有技术方面阻止属性成为泛型。老实说,IMHO属性不应该像它们那样存在,只需要用java的方式获取和设置方法,但这是另一种历史。此声明直接来自MSDN.+1-不仅仅是为了同意我的意见;)泛型约束对属性不起作用,这是有原因的。@ReedCopsey我想知道这是什么原因,因为知道属性无论如何都会解析为方法。@Marco泛型不仅仅对返回类型起作用-对于泛型方法,您需要在方法调用中指定泛型类型。泛型属性需要一种新的调用语法,这很奇怪,因为出于使用目的,属性看起来像字段。消除这种可用性可以使语言设计更干净,并且没有明显的副作用,因为您总是可以编写泛型方法。你怎么称呼这个?你会使用:var rooms=house.卧室代码>语法与其他任何东西都不一样。@ReedCopsey重点是属性被转换为方法,因此没有技术方面阻止属性成为泛型。老实说,IMHO属性不应该像它们那样存在,只需要以java的方式获取和设置方法,但这是另一种历史。不过,请注意,如果不提供差异支持,这将阻止实现类为某些具体的房间类型返回列表作为属性值。不过,请注意,如果没有差异支持,这将阻止实现类将某个具体的房间
类型的列表
返回为属性值。