Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一旦我';我查过它的型号了吗?_C#_Generics - Fatal编程技术网

C# 一旦我';我查过它的型号了吗?

C# 一旦我';我查过它的型号了吗?,c#,generics,C#,Generics,我有一个通用方法,它接受T类型的可枚举项。如果T也是可枚举项,我需要将它传递给另一个函数。然而,由于该函数只接受可枚举项,并且T是泛型的,所以它不会编译。 在通过之前,我会检查T是否是可枚举的,但显然不能解决这个问题 我该怎么做 (显然,我可以编写另一个只接受IEnumerable的方法,并在相关的地方使用它,但这似乎不雅观。) 例如: public static bool EnumerablesAreEqual<T>(IEnumerable<T> a, IEnumera

我有一个通用方法,它接受T类型的可枚举项。如果T也是可枚举项,我需要将它传递给另一个函数。然而,由于该函数只接受可枚举项,并且T是泛型的,所以它不会编译。 在通过之前,我会检查T是否是可枚举的,但显然不能解决这个问题

我该怎么做

(显然,我可以编写另一个只接受IEnumerable>的方法,并在相关的地方使用它,但这似乎不雅观。)

例如:

public static bool EnumerablesAreEqual<T>(IEnumerable<T> a, IEnumerable<T> b)
{
    foreach (T x in a)
    {
        if (x is Enumerable && !EnumerableContainsEnumerable(x, b))
            return false;
        if (!b.Contains(x))
            return false;
    }
    ...
}
公共静态bool EnumerablesAreEqual(IEnumerable a,IEnumerable b)
{
foreach(T x in a)
{
if(x是可枚举的&!EnumerableContainsEnumerable(x,b))
返回false;
如果(!b.包含(x))
返回false;
}
...
}

我已经看过了,但我不认为这是完全相同的问题。

检查变量的动态类型这一事实并没有改变它的静态类型,它用于检查调用的内容也没有改变

如果你想这样做,你需要一个演员。您可以使用选中的强制转换一次性完成:

Enumerable ex = x as Enumerable;
if (ex != null && !EnumerableContainsEnumerable(ex, b))
    return false;

as
操作员检查强制转换是否可行:如果可行,将返回强制转换的对象;如果不是,它将返回
null

检查变量的动态类型不会更改其静态类型,并且它用于检查调用的内容

如果你想这样做,你需要一个演员。您可以使用选中的强制转换一次性完成:

Enumerable ex = x as Enumerable;
if (ex != null && !EnumerableContainsEnumerable(ex, b))
    return false;

as
操作员检查强制转换是否可行:如果可行,将返回强制转换的对象;如果不是,它将返回
null

您的
x是可枚举的
中的
可枚举的
是什么?你是指接口
IEnumerable
还是接口
IEnumerable
,或者这是某个
?类
System.Linq.Enumerable
不可能,因为这是一个
静态类
a
b
是相同类型的集
T
,但是
b
可能包含
a
的集。EnumerableContainsEnumerable是一种检查集b是否包含集x的方法(我将交换参数的顺序,这样更明显)你的
x是可枚举的
?你是指接口
IEnumerable
还是接口
IEnumerable
,或者这是某个
?类
系统。Linq.可枚举的
不能是因为那是一个
静态类
a
b
是相同类型的集合
T
,但
b
可能包含包含
a
的集合?EnumerableContainsEnumerable是一种检查集合b是否包含集合x的方法(我将交换参数的顺序,以便更明显)。这是一个很好的解决方案,但取决于
Enumerable
是什么,
T
Enumerable
之间可能不允许进行转换。您是否假设它是一个接口?但我“无法声明静态类型System.Linq.Enumerable的变量”。有可能将ex声明为泛型类型的IEnumerable吗?@Ollyver:但是如果它是静态类型,那么
x
就不能是那种类型!也许你在用同一个名称混合几种不同的类型…这基本上是我的问题-你的示例是如何工作的?因为如果我使用那个确切的代码,我会将ex声明为静态类型,而h不可能;如果我将ex声明为IEnumerable,我将再次使用动态类型检查。@奥利弗:现在我不明白这个问题……在你的OP中,你说
x是可枚举的
,而
可枚举的
也不能是静态类型。如果你的代码可以编译,我的代码也应该如此。记住,有不止一个type在.NET中命名为
Enumerable
。这是一个很好的解决方案,但取决于
Enumerable
是什么,
T
Enumerable
之间可能不允许进行转换。您是否假设它是一个接口?但我“无法声明静态类型System.Linq.Enumerable的变量”。有可能将ex声明为泛型类型的IEnumerable吗?@Ollyver:但是如果它是静态类型,那么
x
就不能是那种类型!也许你在用同一个名称混合几种不同的类型…这基本上是我的问题-你的示例是如何工作的?因为如果我使用那个确切的代码,我会将ex声明为静态类型,而h不可能;如果我将ex声明为IEnumerable,我将再次使用动态类型检查。@奥利弗:现在我不明白这个问题……在你的OP中,你说
x是可枚举的
,而
可枚举的
也不能是静态类型。如果你的代码可以编译,我的代码也应该如此。记住,有不止一个ty在.NET中命名为可枚举的pe。