Tag: generics

C# – new()约束的generics如何生成机器代码?

public T Foo(U thing) where T : new() { return new T(); } 当没有new()约束时,我理解它是如何工作的。 JIT编译器看到T,如果它是引用类型,则使用代码的对象版本,并专门针对每个值类型的情况。 如果你有一个新的T(),它是如何工作的? 它在哪里寻找?

你能用隐式转换满足generics约束吗?

鉴于以下类型: class A { } class B { public static implicit operator A(B me) { return new A(); } } class Test where T : A { } 我试过了 var b = new Test(); 并期望它失败,它做到了。 但错误信息是 类型’B’不能用作generics类型或方法’Test’中的类型参数’T’。 没有从’B’到’A’的隐式引用转换。 但是有从B到A的隐式引用转换。这只是一个奇怪的消息吗? 亚当罗宾逊的答案显示, 没有隐含的参考转换。 消息是正确的。 请注意, MSDN说: 其中T :(基类名) – 类型参数必须是或从指定的基类派生。 这解释了为什么不允许它,因为B不是从A派生A

其中t:类generics约束和const值声明

根据10.4 Constants C#规范: 常量声明中指定的类型必须是 sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool,string,enum-type 或reference-type。 每个常量表达式必须生成目标类型或可通过隐式转换(第6.1节)转换为目标类型的类型的值。 为什么我不能做以下事情: public class GenericClass where T : class { public const T val = null; } 这应该是可能的,因为: where T : class表示, The type argument must be a reference type; this applies also to any class, interface, delegate, or array type The type argument must be a reference type; […]

有没有办法将这些几乎相同的类合并为一个?

这个问题的后续问题: 为什么Nullable 被认为是结构而不是类? 我有两个类,基本上维护一个用户提供的值的元组与内部对象。 当用户提供的值的类型是基元时,我必须将它包装在Nullable以便它可以在元组中采用空值。 public class BundledClass where T : class { private Tuple _bundle; public T Value { get { return _bundle == null ? null : _bundle.Item1; } set { _bundle = new Tuple(value, internalObj); } } //… public class BundledPrimitive where T : struct { private Tuple _bundle; public T? Value […]

带有generics的C#boxing枚举错误

我不明白这里发生了什么…… 我有以下错误: 类型’TestApp.TestVal’不能用作generics类型或方法’TestApp.SomeClass’中的类型参数’T’ ‘TestApp.SomeClass’ 。 没有从’TestApp.TestVal’到’System.IComparable’装箱转换。 以下代码发生此错误: public enum TestVal { First, Second, Third } public class SomeClass where T : IComparable { public T Stored { get { return storedval; } set { storedval = value; } } private T storedval; } class Program { static void Main(string[] args) { //Error is on the […]

List .AddRange(List )不起作用

我发现无法将具体对象列表添加到接口对象列表中。 public static void AddJob(List masterJobs, List jobs) { masterJobs.AddRange(jobs); //fail to compile } 相反,需要使用以下代码: public static void AddJob(List masterJobs, List jobs) { masterJobs.AddRange(jobs.Cast()); } 这背后的理性是什么?

在UWP应用程序中自引用generics类型约束和XAML

我目前正在开发一个UWP应用程序,其中我在PCL中使用自引用generics类型约束 。 这里描述了PCL的类。 首先,实现自引用generics类型约束的类(此类还实现new()约束) public abstract class A where T : A, new() { //… } 然后,我有一个扩展Windows.UI.Xaml.Controls.Page类的基类: public abstract class MyPage : Page where T : A, new() { //… } 我还有一个扩展Windows.UI.Xaml.Application类的基类: public abstract class MyApplication : Application where T : A, new() { //… } 我的UWP课程以下列方式扩展了上述PCL的类… 首先,我有一个扩展A类的B类: public sealed class B : A { […]

在C#中使用List 时,对象引用未设置为对象实例

我有以下代码片段,产生编译错误: public List batchaddresses; public MapFiles(string [] addresses) { for (int i = 0; i < addresses.Count(); i++) { batchaddresses.AddRange(Directory.GetFiles(addresses[i], "*.esy")); } } 我尝试使用List.AddRange()方法时List.AddRange() : Object reference not set to an instance of an object 我究竟做错了什么?

类型为T的通用,其中T具有特定属性

是否可以创建T类型的generics方法,其中T具有特定属性? 例如: public static XmlDocument SerializeObjectToXml(T obj) { //… } 我想只序列化具有Serializable和/或DataContract属性的类: [Serializable] [DataContract(Name = “viewModel”, Namespace = “ns”)] internal class ViewModel { //… }

非严格的多接口类型参数约束?

对不起,如果这是一个欺骗,但我似乎无法得到正确的关键字组合来过滤各种类型约束和generics问题(因为有很多)。 我有两个接口 – 让我们称它们为IOnline和IOffline 。 它们密切相关,因为它们描述了几乎相同的契约,但它们之间的关键差异之一是将使用具体实现的上下文。 这不完全是我的情况,但它很好地说明了问题。 然后,我有一些方法可以解决这些接口的具体实现。 有时这些方法只想处理一种类型而不是另一种类型。 很简单: public void DoStuff(string foo) where T : IOnline {} 踢球者正在实施可以在EITHER类型上操作的方法的代码。 我认为这是正确的,但在阅读编译错误时,我期望约束将被解释为“允许任何类型T在这里一般使用,如果它们实现IOnline OR IOffline”,实际上被解释为“允许任何类型”如果它们同时实现,则在这里使用T“。 public void DoStuff(string foo) where T : IOnline, IOffline {} 尝试实现具有相同名称但不同约束的两个单独方法失败,因为存在明显的歧义问题 – 我们没有超载,因为参数列表是相同的(因为期望的行为是相同的)。 我可以为两种不同的方法使用两个不同的名称,每个方法都有适当的约束,但这看起来很糟糕,并使下游的其他东西成为屁股中的痛苦……可行但不理想。 我觉得必须有一些我在这里缺少的东西…我觉得在通用土地上非常舒服,但这是我第一次完成我所追求的目标,我觉得我只是在旋转我的车轮atm。