C# 泛型类型上的构造函数约束,还是只检查泛型类型构造函数中的约束?

C# 泛型类型上的构造函数约束,还是只检查泛型类型构造函数中的约束?,c#,generics,constructor,constraints,C#,Generics,Constructor,Constraints,我有一个泛型类DirectorySource,它依赖于接口IDirectorySearch 两者都是泛型,具有相同的类型约束: public class DirectorySource<T> where T : IDirectoryEntry { } public interface IDirectorySearcher<T> where T : IDirectoryEntry { } 然后,我还有以下几点: public class GroupSearcher :

我有一个泛型类
DirectorySource
,它依赖于接口
IDirectorySearch

两者都是泛型,具有相同的类型约束:

public class DirectorySource<T> where T : IDirectoryEntry { }

public interface IDirectorySearcher<T> where T : IDirectoryEntry { }
然后,我还有以下几点:

public class GroupSearcher : IDirectorySearcher<Group> {

    public GroupSearcher(DirectoryEntry root, SearchScope scope) {
        NativeSearcher = new DirectorySearcher();
        NativeSearcher.SearchRoot = root;
        NativeSearcher.SearchScope = scope;
    }

    // Implementing interface...
}
这对我来说似乎不正确

1。我是不是错过了一些明显的东西?=)

提前谢谢

当我的泛型类型DirectorySource为
DirectorySource
type,我的搜索者是一个GroupSearcher

为什么??这与将searcher功能封装到接口中的观点背道而驰,是吗?您不应该关心实现是什么,只要它可以搜索正确类型的条目

我不认为构造函数约束在这里是真正相关的-这只允许您创建一个没有参数的
t
的新实例

编辑:我看不出你提出的问题实际上是个什么问题。让我们看看代码:

IDirectorySearcher<User> userSearcher = new UserSearcher(ROOT, SCOPE);
IDirectorySource<Group> groups = new DirectorySource<Group>(userSearcher);
IDirectorySearcher userSearcher=新用户搜索器(根,范围);
IDirectorySource组=新目录源(userSearcher);
因此这里
DirectorySource
T
Group
。现在,构造函数将要求您传入一个
IDirectorySearcher
——据我所知,
userSearcher
不是。所以这段代码不会编译,这正是您想要的。问题出在哪里

当我的泛型类型DirectorySource为
DirectorySource
type,我的搜索者是一个GroupSearcher

为什么??这与将searcher功能封装到接口中的观点背道而驰,是吗?您不应该关心实现是什么,只要它可以搜索正确类型的条目

我不认为构造函数约束在这里是真正相关的-这只允许您创建一个没有参数的
t
的新实例

编辑:我看不出你提出的问题实际上是个什么问题。让我们看看代码:

IDirectorySearcher<User> userSearcher = new UserSearcher(ROOT, SCOPE);
IDirectorySource<Group> groups = new DirectorySource<Group>(userSearcher);
IDirectorySearcher userSearcher=新用户搜索器(根,范围);
IDirectorySource组=新目录源(userSearcher);
因此这里
DirectorySource
T
Group
。现在,构造函数将要求您传入一个
IDirectorySearcher
——据我所知,
userSearcher
不是。所以这段代码不会编译,这正是您想要的。问题出在哪里?

您是否考虑过:

public class DirectorySource<TValue, TSearcher> 
            where TValue : IDirectoryEntry 
            where TSearcher : IDirectorySearcher<T>, new() 
{ 
    public DirectorySource(TSearcher seacher) 
    { 
        Searcher = seacher
    } 

    public TSearcher Searcher { get; private set; } 
} 

IDirectorySearcher<Group> groupSearcher = new GroupSearcher(ROOT, SCOPE);     
var  groups = new DirectorySource<Group, GroupSearcher>(groupSearcher); 
公共类目录源
where TValue:IDirectoryEntry
where TSearcher:idirectorysarcher,new()
{ 
公共目录源(Tsarcher seacher)
{ 
搜索者=seacher
} 
公共搜索器{get;private set;}
} 
IDirectorySearcher groupSearcher=新的groupSearcher(根,范围);
var groups=新目录源(groupSearcher);
您是否考虑过:

public class DirectorySource<TValue, TSearcher> 
            where TValue : IDirectoryEntry 
            where TSearcher : IDirectorySearcher<T>, new() 
{ 
    public DirectorySource(TSearcher seacher) 
    { 
        Searcher = seacher
    } 

    public TSearcher Searcher { get; private set; } 
} 

IDirectorySearcher<Group> groupSearcher = new GroupSearcher(ROOT, SCOPE);     
var  groups = new DirectorySource<Group, GroupSearcher>(groupSearcher); 
公共类目录源
where TValue:IDirectoryEntry
where TSearcher:idirectorysarcher,new()
{ 
公共目录源(Tsarcher seacher)
{ 
搜索者=seacher
} 
公共搜索器{get;private set;}
} 
IDirectorySearcher groupSearcher=新的groupSearcher(根,范围);
var groups=新目录源(groupSearcher);

我认为获得所需内容的唯一方法(据我理解)是向
IDirectorySharer
添加一个
GetSource
方法,该方法返回
IDirectorySource

的实现。我认为获得所需内容的唯一方法(据我理解)如果您将
GetSource
方法添加到
idirectorysarcher
中,该方法将返回
IDirectorySource
的实现,谢谢您的回答。我之所以要这样做,是因为,就目前而言,人们可以做以下几点:(请参阅我的编辑1)。如果您看到我的编辑1,您现在可能会更好地理解为什么我要对一个
GroupSearcher
,强制它或约束或其他任何东西,以继续我的示例。您认为我应该做些什么?我的设计不好吗=S@Will当前位置我不清楚那将如何编译。您可能试图创建一个
DirectorySource
来传递一些没有实现
idirectorysarcher
的东西,所以就我所见,它不会编译。你试过了吗?我对泛型很陌生,我认为
DirectorySource
中的
T
IDirectorySearcher
中的
T
是完全独立的,即使
T
是在源代码中指定的。为了回答你的问题,我还没有测试它,因为我在VB.NET2.0中编写了这段代码,它不允许我使用我在C#中使用过的大量功能,所以我用C#重写它,就像我会做的那样,然后在测试完成后使用从C#到VBNET的转换器。此外,通过您的编辑,我看不出有任何问题!=)谢谢,这很有帮助!=)谢谢你的回答。我之所以要这样做,是因为,就目前而言,人们可以做以下几点:(请参阅我的编辑1)。如果您看到我的编辑1,您现在可能会更好地理解为什么我要对一个
GroupSearcher
,强制它或约束或其他任何东西,以继续我的示例。您认为我应该做些什么?我的设计不好吗=S@Will当前位置我不清楚那将如何编译。您可能试图创建一个
DirectorySource
来传递一些没有实现
idirectorysarcher
的东西,所以就我所见,它不会编译。你试过了吗?我对泛型很陌生,我认为
DirectorySource
中的
T
IDirectorySearcher
中的
T
是完全独立的,即使
T
public class DirectorySource<TValue, TSearcher> 
            where TValue : IDirectoryEntry 
            where TSearcher : IDirectorySearcher<T>, new() 
{ 
    public DirectorySource(TSearcher seacher) 
    { 
        Searcher = seacher
    } 

    public TSearcher Searcher { get; private set; } 
} 

IDirectorySearcher<Group> groupSearcher = new GroupSearcher(ROOT, SCOPE);     
var  groups = new DirectorySource<Group, GroupSearcher>(groupSearcher);