相关疑难解决方法(0)

最奇怪的语言特征

在您看来,您遇到的最令人惊讶,奇怪,奇怪或真正的"WTF"语言功能是什么?

每个答案只能有一个功能.

language-agnostic programming-languages

975
推荐指数
176
解决办法
48万
查看次数

任何人都知道缺乏枚举通用约束的好方法吗?

我想要做的是这样的:我有枚举标记值的枚举.

public static class EnumExtension
{
    public static bool IsSet<T>( this T input, T matchTo ) 
        where T:enum //the constraint I want that doesn't exist in C#3
    {    
        return (input & matchTo) != 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么我可以这样做:

MyEnum tester = MyEnum.FlagA | MyEnum.FlagB

if( tester.IsSet( MyEnum.FlagA ) )
    //act on flag a
Run Code Online (Sandbox Code Playgroud)

不幸的是,C#的通用,其中约束没有枚举限制,只有类和结构.C#不会将枚举视为结构(即使它们是值类型),因此我无法像这样添加扩展类型.

有没有人知道解决方法?

.net c# enums flags

87
推荐指数
6
解决办法
2万
查看次数

在C#中将Int转换为Generic Enum

类似于C#中的Cast int to enum,但我的枚举是Generic Type参数.处理这个问题的最佳方法是什么?

例:

private T ConvertEnum<T>(int i) where T : struct, IConvertible
{
    return (T)i;
}
Run Code Online (Sandbox Code Playgroud)

生成编译器错误 Cannot convert type 'int' to 'T'

完整代码如下,其中value可以包含int或null.

private int? TryParseInt(string value)
{
    var i = 0;
    if (!int.TryParse(value, out i))
    {
        return null;
    }
    return i;
}

private T? TryParseEnum<T>(string value) where T : struct, IConvertible
{
    var i = TryParseInt(value);
    if (!i.HasValue)
    {
        return null;
    }

    return (T)i.Value;
}
Run Code Online (Sandbox Code Playgroud)

c# generics enums casting

74
推荐指数
5
解决办法
3万
查看次数

我可以从泛型类型转换为C#中的枚举吗?

我正在编写一个实用程序函数,它从数据库中获取一个整数,并将一个类型化的枚举返回给应用程序.

这是我试图做的(注意我传入数据读取器和列名而不是int我的真实函数):

public static T GetEnum<T>(int enumAsInt)
{
    Type enumType = typeof(T);

    Enum value = (Enum)Enum.ToObject(enumType, enumAsInt);
    if (Enum.IsDefined(enumType, value) == false)
    {
        throw new NotSupportedException("Unable to convert value from database to the type: " + enumType.ToString());
    }

    return (T)value;
}
Run Code Online (Sandbox Code Playgroud)

但它不会让我(T)value说:

无法将类型'System.Enum'转换为'T'.

我也读过很多关于使用的评论Enum.IsDefined.表现明智,听起来很糟糕.我怎样才能保证有效价值?

c# generics enums casting

43
推荐指数
2
解决办法
2万
查看次数

在C#中使用enum作为泛型类型参数

可能重复:
C#中的枚举类型约束

是否可以enum通过使用其包装类将类型用作通用参数Enum

我有不同的枚举:

enum errors1 { E1, E3, E8 };
enum errors2 { E0, E2, E9 };
enum errors3 { E7, E4, E5 };
Run Code Online (Sandbox Code Playgroud)

通过以下类声明,我认为我可以实现它:

public class MyErrors<T> where T : Enum
{
   T enumeration;

   public T getEnumeration()
   {
       return enumeration;
   }

   static void Main(string[] args)
   {

       Program<error1> p = new Program<error1>();
       p.getEnumeration().E1  // this call does NOT work
   }
Run Code Online (Sandbox Code Playgroud)

但是,由于一般类型是Enum我只能访问类的成员和方法Enum.那么我可以按照我的意图实现它,或者我应该使用其他方法吗?

c# generics enums

34
推荐指数
2
解决办法
4万
查看次数

为什么在即将推出的.NET 4.0中没有类似IMonad <T>的东西

...与所有那些新的(如果我们计算IEnumerable不是那么新)与monad相关的东西?

interface IMonad<T>
{
 SelectMany/Bind();
 Return/Unit();
}
Run Code Online (Sandbox Code Playgroud)

这将允许编写以任何monadic类型操作的函数.或者它不是那么重要?

.net c# monads

29
推荐指数
1
解决办法
4704
查看次数

"实数"类型是否存在C#泛型约束?

可能重复:
仅对整数的C#泛型约束

映入眼帘!

我正在尝试在C#中设置笛卡尔坐标系,但我不想将自己限制为我的坐标值的任何一种数值类型.有时它们可​​能是整数,有时它们可​​能是有理数,取决于上下文.

这对我来说是"通用类",但我对如何将类型限制为积分和浮点感到难过.我似乎无法找到涵盖任何实数概念的课程......

public class Point<T> where T : [SomeClassThatIncludesBothIntsandFloats?]  {
    T myX, myY;

    public Point(T x, T y) {
        myX = x;
        myY = y;
    }
}

Point<int> pInt = new Point<int>(5, -10);
Point<float> pFloat = new Point<float>(3.14159, -0.2357);
Run Code Online (Sandbox Code Playgroud)

如果我想要这种自由度,那么当我在课堂上进行计算,除去bool,字符串,对象等时,我是否选择了"typeof(T)"噩梦?或者更糟糕的是,我是否选择为我想要使用的每种类型的数字创建一个类,每个都有相同的内部数学公式?

任何帮助,将不胜感激.谢谢!

c# generics constraints

21
推荐指数
3
解决办法
2万
查看次数

模拟实现接口的枚举的行为

说我有一个类似的枚举:

enum OrderStatus
{
    AwaitingAuthorization,
    InProduction,
    AwaitingDespatch
}
Run Code Online (Sandbox Code Playgroud)

我还在我的枚举上创建了一个扩展方法来整理UI中的显示值,所以我有类似的东西:

public static string ToDisplayString(this OrderStatus status)
{
    switch (status)
    {
        case Status.AwaitingAuthorization:
            return "Awaiting Authorization";

        case Status.InProduction:
            return "Item in Production";

        ... etc
    }
}
Run Code Online (Sandbox Code Playgroud)

灵感来自这里的优秀帖子,我想SelectList用扩展方法将我的枚举绑定到一个:

public static SelectList ToSelectList<TEnum>(this TEnum enumObj)

但是,要在UI下拉列表中使用DisplayString值,我需要添加一个约束

: where TEnum has extension ToDisplayString

显然,除非有一些我不知道的聪明伎俩,否则这一切都不会对当前的方法起作用.

有没有人对我如何能够实现这样的事情有任何想法?

c# extension-methods enums interface

13
推荐指数
1
解决办法
9036
查看次数

在C#3.0中是否存在针对"特殊类"Enum的泛型类型约束的解决方法?

更新:请参阅此问题的底部以获取C#解决方法.

嗨,您好,

请考虑以下扩展方法:

public static bool HasFlags<T>(this T value, T flags)
    where T : System.Enum
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

您可能知道,这将在编译时抛出一个错误,因为通常不允许继承类System.Enum.问题是使用enum关键字指定的任何枚举实际上都继承自System.Enum,因此上述代码将是仅将扩展方法限制为枚举的理想方法.

现在显而易见的解决方法是使用Enum而不是T,但是你失去了泛型类型的好处:

MyEnum e;
e.HasFlags(MyOtherEnum.DoFunkyStuff);
Run Code Online (Sandbox Code Playgroud)

上面的代码会使用泛型类型抛出编译时错误,而它只能使用Enum类型抛出运行时错误(如果我实现它的话).

是否有任何编译器选项可用于关闭约束检查,还是有其他一些漂亮的方法来做到这一点?

在建议之前,我想说我不会使用where T : struct或者其他一些,从那以后你就可以做一些奇怪的事情了123.HasFlags(456).

我很难理解为什么会出现这个错误...这是你要使用的同样的问题where T : System.Object,但是你有where T : class...为什么没有where T : enum

C#解决方法

Jon Skeet已经开始研究一个库,该库将带有约束的类编译为a IEnumConstraint,然后将其替换为System.Enumpost-build.我相信,这是目前最接近解决这个问题的人.

看到:

如果此解决方法不可行,则必须将库编写为C++/CLI代码,这不会限制可用于泛型类型约束的内容(请参阅下面的答案中的代码.)

.net c# generics extension-methods

10
推荐指数
1
解决办法
3438
查看次数

有没有办法将类中的枚举属性设置为所有可用的枚举?

首先,我不知道如何标题这个问题 - 我甚至对如何陈述它感到困惑.

现在提出问题.让我们把System.IO.FileSystemWatcher你设置它的NotifyFilter属性的类:

            this.FileSystemWatcher1.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.FileName 
            | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security 
            | NotifyFilters.Size;
Run Code Online (Sandbox Code Playgroud)

这是设置单个属性的相当多的代码.检查NotifyFilter,这是一个列举.是否有" 懒惰 "或" 快捷 "方式一次性设置所有这些属性?我知道这不一定需要,但我的好奇心被激怒了.

this.FileSystemWatcher1.NotifyFilter = <NotifyFilters.All>

c# enums

9
推荐指数
2
解决办法
495
查看次数