我正在构建一个扩展Enum.Parse概念的函数
所以我写了以下内容:
public static T GetEnumFromString<T>(string value, T defaultValue) where T : Enum
{
if (string.IsNullOrEmpty(value)) return defaultValue;
foreach (T item in Enum.GetValues(typeof(T)))
{
if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
}
return defaultValue;
}
Run Code Online (Sandbox Code Playgroud)
我得到一个Error Constraint不能是特殊类System.Enum.
很公平,但是有一个解决方法允许Generic Enum,或者我将不得不模仿该Parse函数并将类型作为属性传递,这会迫使您的代码出现丑陋的拳击要求.
编辑以下所有建议都非常感谢,谢谢.
已经解决了(我已离开循环以保持不区分大小写 - 我在解析XML时使用它)
public static class EnumUtils
{
public static T ParseEnum<T>(string value, T defaultValue) where T : struct, IConvertible
{
if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
if (string.IsNullOrEmpty(value)) return …Run Code Online (Sandbox Code Playgroud) 在C#中,您可以对通用方法设置约束,例如:
public class A {
public static void Method<T> (T a) where T : new() {
//...do something...
}
}
Run Code Online (Sandbox Code Playgroud)
您指定的T应该具有不需要参数的构造函数.我想知道是否有办法添加一个约束,如" 存在一个带float[,]参数的构造函数? "
以下代码无法编译:
public class A {
public static void Method<T> (T a) where T : new(float[,] u) {
//...do something...
}
}
Run Code Online (Sandbox Code Playgroud)
解决方法也有用吗?
在未能获得类似以下内容的编译之后:
public class Gen<T> where T : System.Array
{
}
Run Code Online (Sandbox Code Playgroud)
有错误
约束不能是特殊的类`System.Array'
我开始疑惑,究竟什么是 "特殊班级"?
当人们System.Enum在泛型约束中指定时,人们似乎经常会遇到同样的错误.我得到了相同的结果System.Object,System.Delegate,System.MulticastDelegate和System.ValueType也.
还有更多吗?我在C#中找不到关于"特殊类"的任何信息.
此外,什么是如此特殊的,我们不能把它们作为一个泛型类型约束类?
物品类
public class Item
{
public bool Check(int value) { ... }
}
Run Code Online (Sandbox Code Playgroud)
具有泛型类型约束的基本抽象类
public abstract class ClassBase<TItem>
where TItem : Item
{
protected IList<TItem> items;
public ClassBase(IEnumerable<TItem> items)
{
this.items = items.ToList();
}
public abstract bool CheckAll(int value);
}
Run Code Online (Sandbox Code Playgroud)
没有约束的继承类
public class MyClass<TItem> : ClassBase<TItem>
{
public override bool CheckAll(int value)
{
bool result = true;
foreach(TItem item in this.items)
{
if (!item.Check(value)) // this doesn't work
{
result = false;
break;
}
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么泛型类型约束不可继承?因为如果我的继承类继承自基类并传递其对基类具有约束的泛型类型,则它自动意味着继承类中的泛型类型应具有相同的约束而不显式定义它.不应该吗? …
可能重复:可以为
Nullable类型作为通用参数?
我遇到了泛型类型约束非常奇怪的事情.我有一个这样的课:
public SomeClass<T> where T:class
{
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现我不能像我期望的那样使用可空类型:
new SomeClass<int?>();
Run Code Online (Sandbox Code Playgroud)
我得到一个int?必须是引用类型的错误.Nullable真的只是一个带有语法糖的结构,使它看起来像一个引用类型吗?
假设我们有一些像这样的测试接口/类:
abstract class Plant {
public abstract String getName();
}
interface Eatable { }
class Apple extends Plant implements Eatable {
@Override
public String getName() {
return "Apple";
}
}
class Rose extends Plant {
@Override
public String getName() {
return "Rose";
}
}
interface Animal {
<T extends Plant & Eatable> void eat(T plant);
}
Run Code Online (Sandbox Code Playgroud)
您可以看到Animal.eat具有约束的通用方法.现在我的Human班级是这样的:
class Human implements Animal {
@Override
public void eat(Plant plant) {
}
}
Run Code Online (Sandbox Code Playgroud)
编译好.你可以看到Human.eat比限制较少Animal.eat,因为Eatable …
昨天,我向朋友们解释了C#的通用限制.在展示where T : CLASSNAME约束时,我掀起了这样的事情:
public class UnusableClass<T> where T : UnusableClass<T>
{
public static int method(T input){
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
并且看到它编译真的很惊讶.然而,经过一番思考之后,我认为从编译器的角度来看它是完全合法的 - UnusableClass<T>与其他任何可用于此约束的类一样多.
然而,这留下了几个问题:如何使用这个类?是否有可能
int method?如果是的话,怎么样?
如果其中任何一种都可能,那么它的类型T是什么?
因此,定义了TypeScript中的索引签名:
字典
[key: string]: T
Run Code Online (Sandbox Code Playgroud)
排列
[index: number]: T
Run Code Online (Sandbox Code Playgroud)
这些可以包装成一些简单,可重用的类型:
type DictionaryIndex<T> = {
[key: string]: T
}
type ArrayIndex<T> = {
[index: number]: T
}
Run Code Online (Sandbox Code Playgroud)
现在我想将它们包装成单一类型.我试过这个:
type Index<TKey extends string|number, TValue> = {
[key: TKey]: TValue
}
Run Code Online (Sandbox Code Playgroud)
由于以下错误,这不会编译:
索引签名参数必须是"string"或"number"类型.
这不可能吗?
到底是为了什么?
因为
foo(obj: Index<string, Bar>)
foo(obj: Index<string, Bar> & Fooable<string>)
Run Code Online (Sandbox Code Playgroud)
看起来比
foo(obj: { [key: string]: Bar })
foo(obj: { [key: string]: Bar, canFoo: (foo: string) => Bar })
Run Code Online (Sandbox Code Playgroud) 鉴于以下代码......
type Indexable<TKey, TValue> = { [index: TKey]: TValue }
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
索引签名参数类型必须是"字符串"或"数字".
有没有办法约束TKey为'字符串'或'数字'?
generics ×9
c# ×7
typescript ×2
class ×1
constructor ×1
enums ×1
inheritance ×1
java ×1
java-8 ×1
nullable ×1
parameters ×1