Questions tagged «generics»

泛型是在多种语言中发现的参数多态形式,包括.NET语言,Java,Swift和Rust。

18
将单个项目作为IEnumerable <T>传递
是否有一种常见的方法将单个类型的项目传递给T需要IEnumerable&lt;T&gt;参数的方法 ?语言是C#,框架版本2.0。 当前,我正在使用辅助方法(它是.Net 2.0,所以我有一堆类似于LINQ的强制转换/投影辅助方法),但这似乎很愚蠢: public static class IEnumerableExt { // usage: IEnumerableExt.FromSingleItem(someObject); public static IEnumerable&lt;T&gt; FromSingleItem&lt;T&gt;(T item) { yield return item; } } 当然,其他方法是创建并填充a List&lt;T&gt;或an Array并将其传递给而不是IEnumerable&lt;T&gt;。 [编辑]作为扩展方法,它可以命名为: public static class IEnumerableExt { // usage: someObject.SingleItemAsEnumerable(); public static IEnumerable&lt;T&gt; SingleItemAsEnumerable&lt;T&gt;(this T item) { yield return item; } } 我在这里想念什么吗? [Edit2]我们发现someObject.Yield()(如@Peter在下面的评论中所建议的)是此扩展方法的最佳名称,主要是为了简洁起见,因此,如果有人想要抓住它,它与XML注释一起使用: public …
377 c#  .net  generics  ienumerable 


12
运算符==不能应用于C#中的泛型类型吗?
根据MSDN中==运营商的文档, 对于预定义的值类型,相等运算符(==)如果其操作数的值相等,则返回true,否则返回false。对于字符串以外的引用类型,如果==的两个操作数引用同一对象,则==返回true。对于字符串类型,==比较字符串的值。用户定义的值类型可能会使==运算符重载(请参阅运算符)。用户定义的引用类型也可以,尽管 默认情况下==的行为与上述预定义和用户定义的引用类型相同。 那么,为什么此代码片段无法编译? bool Compare&lt;T&gt;(T x, T y) { return x == y; } 我收到错误运算符'=='不能应用于类型'T'和'T'的操作数。我不知道为什么,因为据我所知,该==操作符是为所有类型预定义的? 编辑:谢谢大家。起初我没有注意到该声明仅与引用类型有关。我还认为为所有值类型提供了逐位比较,现在我知道这是不正确的。 但是,如果我使用的是引用类型,==操作员会使用预定义的引用比较吗?如果定义了一个类型,它会使用操作员的重载版本吗? 编辑2:通过反复试验,我们了解到,==当使用无限制的泛型类型时,运算符将使用预定义的引用比较。实际上,编译器将使用它可以为受限类型参数找到的最佳方法,但是不再赘述。例如,true即使Test.test&lt;B&gt;(new B(), new B())被调用,下面的代码也将始终print : class A { public static bool operator==(A x, A y) { return true; } } class B : A { public static bool operator==(B x, B y) …

16
检查一个类是否从泛型类派生
我的项目中有一个带有派生类的泛型类。 public class GenericClass&lt;T&gt; : GenericInterface&lt;T&gt; { } public class Test : GenericClass&lt;SomeType&gt; { } 有没有办法找出Type对象是否源自GenericClass? t.IsSubclassOf(typeof(GenericClass&lt;&gt;)) 不起作用。
309 c#  generics  reflection 

8
IEnumerable和使用收益回报的递归
我有一种IEnumerable&lt;T&gt;用于在WebForms页面中查找控件的方法。 该方法是递归的,当返回yield return值为递归调用的值时,返回我想要的类型时遇到一些问题。 我的代码如下所示: public static IEnumerable&lt;Control&gt; GetDeepControlsByType&lt;T&gt;(this Control control) { foreach(Control c in control.Controls) { if (c is T) { yield return c; } if(c.Controls.Count &gt; 0) { yield return c.GetDeepControlsByType&lt;T&gt;(); } } } 当前,这将引发“无法转换表达式类型”错误。但是IEnumerable&lt;Object&gt;,如果此方法返回type ,则代码会生成,但是在输出中返回错误的类型。 有没有yield return同时使用递归的使用方法?




13
C#中泛型参数的空值或默认比较
我有这样定义的通用方法: public void MyMethod&lt;T&gt;(T myArgument) 我要做的第一件事是检查myArgument的值是否是该类型的默认值,如下所示: if (myArgument == default(T)) 但这不能编译,因为我不能保证T将实现==运算符。所以我将代码切换为: if (myArgument.Equals(default(T))) 现在可以编译,但是如果myArgument为null,则失败,这是我要测试的一部分。我可以像这样添加一个显式的null检查: if (myArgument == null || myArgument.Equals(default(T))) 现在这对我来说是多余的。ReSharper甚至建议我将myArgument == null部分更改为myArgument == default(T),这是我开始的地方。有解决这个问题的更好方法吗? 我需要支持两种引用类型和值类型。
288 c#  generics 

11
可空类型作为通用参数吗?
我想做这样的事情: myYear = record.GetValueOrNull&lt;int?&gt;("myYear"), 请注意,可为null的类型作为通用参数。 由于GetValueOrNull函数可以返回null,因此我的第一次尝试是: public static T GetValueOrNull&lt;T&gt;(this DbDataRecord reader, string columnName) where T : class { object columnValue = reader[columnName]; if (!(columnValue is DBNull)) { return (T)columnValue; } return null; } 但是我现在得到的错误是: 类型“ int?” 必须是引用类型,才能在通用类型或方法中将其用作参数“ T” 对!Nullable&lt;int&gt;是一个struct!所以我尝试将类约束更改为struct约束(并且副作用不再返回null): public static T GetValueOrNull&lt;T&gt;(this DbDataRecord reader, string columnName) where T …
287 c#  generics 

6
使用Mockito模拟具有通用参数的类
有没有一种使用通用参数模拟类的干净方法?说我必须模拟一个类Foo&lt;T&gt;,我需要将该类传递给期望使用的方法Foo&lt;Bar&gt;。我可以很容易地做到以下几点: Foo mockFoo = mock(Foo.class); when(mockFoo.getValue).thenReturn(new Bar()); 假定getValue()返回通用类型T。但是,当我稍后将其传递给期望的方法时,将会有小猫Foo&lt;Bar&gt;。铸造是这样做的唯一方法吗?
280 java  generics  mockito 

5
Scala中什么是更高种类的类型?
您可以在网上找到以下内容: 更高种类的类型==类型构造函数? class AClass[T]{...} // For example, class List[T] 有人说这是一种更高种类的类型,因为它抽象了符合该定义的类型。 较高种类的类型是采用其他类型并构造新类型的类型 这些虽然也称为类型构造函数。(例如,在Scala编程中)。 更高种类的类型==类型构造函数,它将类型构造函数作为类型参数? 在高级类属的论文中,您可以阅读 ...在类型上进行抽象的类型,在类型上进行抽象(“高级类型”)...” 这表明 class XClass[M[T]]{...} // or trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]] 是一种较高的类型。 因此,考虑到这一点,很难区分类型构造函数,更高种类的类型和将类型构造函数作为类型参数的类型构造函数,因此存在上述问题。

17
我不能在Java中创建通用数组类型的原因是什么?
Java不允许我们这样做的原因是什么 private T[] elements = new T[initialCapacity]; 我可以理解.NET不允许我们这样做,因为.NET中的值类型在运行时可以具有不同的大小,但是在Java中,各种T都是对象引用,因此具有相同的大小(如我错了请纠正我)。 是什么原因?

3
Collections.emptyList()返回List <Object>?
我在浏览Java推断通用类型参数的规则时遇到了一些麻烦。考虑以下类,该类具有可选的list参数: import java.util.Collections; import java.util.List; public class Person { private String name; private List&lt;String&gt; nicknames; public Person(String name) { this(name,Collections.emptyList()); } public Person(String name,List&lt;String&gt; nicknames) { this.name = name; this.nicknames = nicknames; } } 我的Java编译器给出以下错误: Person.java:9: The constructor Person(String, List&lt;Object&gt;) is undefined 但是Collections.emptyList()返回类型&lt;T&gt; List&lt;T&gt;,不是List&lt;Object&gt;。添加演员表无济于事 public Person(String name) { this(name,(List&lt;String&gt;)Collections.emptyList()); } …

14
获取java.util.List的通用类型
我有; List&lt;String&gt; stringList = new ArrayList&lt;String&gt;(); List&lt;Integer&gt; integerList = new ArrayList&lt;Integer&gt;(); 有没有一种(简单的)方法来检索列表的通用类型?
262 java  generics 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.