任何人都可以告诉我是否有一种方法可以使用泛型来限制泛型类型参数T:
Int16Int32Int64UInt16UInt32UInt64我知道的where关键字,但无法找到一个接口只有这些类型,
就像是:
static bool IntegerFunction<T>(T value) where T : INumeric
Run Code Online (Sandbox Code Playgroud) 可能重复:
任何人都知道缺少枚举通用约束的好方法?
C#不允许对Enums 进行类型约束的原因是什么?我确信疯狂背后有一种方法,但我想明白为什么不可能.
以下是我希望能够做到的(理论上).
public static T GetEnum<T>(this string description) where T : Enum
{
...
}
Run Code Online (Sandbox Code Playgroud) 我试图理解为什么下面的第二个例子没有问题,但第一个例子给了我下面的例外.在我看来,两个例子都应该基于描述给出例外.任何人都可以开导我吗?
未处理的异常:System.TypeLoadException:无法从程序集'StructTest,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'加载类型'StructTest.OuterType',因为它包含偏移0处的对象字段,该字段未正确对齐或重叠由非对象字段.
在StructTest.Program.Main(String [] args)按任意键继续...
例1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace StructTest
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct InnerType
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
char[] buffer;
}
[StructLayout(LayoutKind.Explicit)]
struct OuterType
{
[FieldOffset(0)]
int someValue;
[FieldOffset(0)]
InnerType someOtherValue;
}
class Program
{
static void Main(string[] args)
{
OuterType t = new OuterType();
System.Console.WriteLine(t);
}
}
}
Run Code Online (Sandbox Code Playgroud)
例2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace StructTest …Run Code Online (Sandbox Code Playgroud) 我正在一个小型教育项目中工作,我们必须实现一个n维矩阵.根据上下文,此矩阵可以使用我们自己的内置ComplexNumber结构,System.Double也可以使用非常简单的示例,使用整数类型(主要是System.Int32).
由于应用程序的性质,我们不需要实现闪电般快速的性能.
因此,我的第一个想法是实行Matrix<T>地方T会以某种方式需要被限制在"数字".
这样做的一个明显问题是,语言中没有办法T用定义的运算符约束泛型类型.此外,我没有看到一种简单的方法来重新T合理到合理的类型.
我的问题是:
有人可以指出我的优雅方式,使用通用类型进行数学运算,不会过多地影响性能,并以某种方式使内置类型工作(如果可能).
如果Eric读过这篇文章,那么这个功能(通过定义的运算符约束泛型类型)是否会出现在C#设计会议的假设未来版本中,并且它是否已经接近将其纳入语言?
我知道实现一个ComplexMatrix类型并为每个矩阵"子类型"(双重,整数等)创建包装器更容易,更好,并支付我们的复杂类型和矩阵元素发生的任何类型之间的转换的性能成本成为.这个问题更多的是出于对某人如何实施类似场景的好奇心.
我想为一些内置类型添加一个接口.我有一个接口,IConcludable我用它作为约束Conclusion<T>.我不知道如何处理这个问题,或者它是否可能.
基本布局
public interface IConcludable { }
public struct Conclusion<T> where T : IConcludable
{
public bool IsSuccessful;
public T Result;
// Constructors, members, etc.
}
public class ErrorReport : IConcludable { ... }
public class MathArg : IConcludable { ... }
public class ParseResult : IConcludable { ... }
Run Code Online (Sandbox Code Playgroud)
履行
public Conclusion<ParseResult> ParseInput (string input)
{
// Parse input...
// Initialize ParseResult object...
return new Conclusion<ParseResult>(result);
}
Run Code Online (Sandbox Code Playgroud)
问题
当我得到的终值,它就像一个内置式int,double,string, …
我想写一个可以接受任何数字的C#方法.就像是:
public static T Sum(T a, T b) where T : number { // (not real code)
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
但我没有在C#中看到一个"数字"基类,就像我用过的大多数其他语言一样.数值类型是IComparable,IFormattable,IConvertible,IComparable和IEquatable,但似乎没有任何算术功能.它们都是结构,除了物体外没有明显的共同超类.(请原谅我,如果我搞砸了这里的意思,因为我不太熟悉C#结构,而且正是他们对类的所有方式都不太熟悉.)
我是否遗漏了某些内容,或者是否无法在C#中编写一个执行"a + b"的方法而不在"+"的上下文中明确指出a和b是什么?
我正在尝试编写处理不同数字类型的类.我知道C#(和我一般认为.Net)没有INumber接口,所以我不能使用如下内容:
public class Adder<T> where T:INumber
{
public T Add(T a, T b)
{
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
不过没关系,因为我想避免我的每个号码的装箱/拆箱.但是,我可以为我想支持的每种类型使用条件编译:
#if FLOAT
public class AdderF
{
public float Add(float a, float b)
#else
public class Adder
{
public int Add(int a, int b)
#endif
{
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着我需要编写不同的Library.dll和LibraryF.dll,但是.有没有更优雅的解决方案呢?
显然,在我的例子中,我可以简单地编写代码两次.但是,我想使用此过程来创建具有整数版本和浮点版本的大型复杂数据结构,因此在更新结构时不希望出现复制粘贴错误的可能性.我也不希望速度损失将浮点结构包装在一个整体包装器中,并且不必要地将所有输入转换为更宽松的数据类型.
可能重复:
仅对整数的C#泛型约束
正如您在下面的代码中看到的,我需要计算两个通用数字的总和.
public class NumberContainer<T>
{
public T ValueA { get; private set; }
public T ValueB { get; private set; }
public T Total { get { return ValueA + ValueB; } }
}
Run Code Online (Sandbox Code Playgroud)
但是,不可能直接添加两个T值,这会导致编译器错误如下:
运算符'+'不能应用于'T'和'T'类型的操作数
鉴于我不打算将T用于表示数字的值类型(short,ushort,int,uint等)以外的其他任何东西,我怎么能执行总和呢?(效率是一个需要考虑的因素)
c# ×8
.net ×3
generics ×3
built-in ×1
clr ×1
constraints ×1
enums ×1
inheritance ×1
numbers ×1
operators ×1
polymorphism ×1
structlayout ×1