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的方式获取和设置方法,但这是另一种历史。不过,请注意,如果不提供差异支持,这将阻止实现类为某些具体的
房间
类型返回
列表作为属性值。不过,请注意,如果没有差异支持,这将阻止实现类将某个具体的
房间
类型的
列表
返回为属性值。