课程

时间:2017-09-20 11:54:04

标签: c# constraints

尝试在类上定义约束,但得到错误:

public class Utilities3<T> where T : IComparable
{
    public T Max<T>(T a, T b) 
    {
        return a.CompareTo(b) > 0 ? a : b;
    }
}
  

&#39; T&#39;不包含&#39; CompareTo&#39;的定义没有扩展方法&#39; CompareTo&#39;接受第一个类型&#39; T&#39;可以找到(你错过了使用指令或程序集引用吗?)

     

无法解析符号&#39; CompareTo&#39;

error

虽然对功能的约束很好:

public class Utilities2<T>
{
    public T Max<T>(T a, T b) where T : IComparable
    {
        return a.CompareTo(b) > 0 ? a : b;
    }
}

为什么限制课不起作用?

3 个答案:

答案 0 :(得分:7)

问题在于您已对方法重新定义T并隐藏了在课程中定义的T。因此,您需要对方法进行约束,或者您不应该重新定义泛型类型。

public class Utilities3<T> where T : IComparable
{
    public T Max(T a, T b) 
    {
        return a.CompareTo(b) > 0 ? a : b;
    }
}

您通常只在类或其方法上定义泛型类型。如果出于某种原因你确实需要在两个地方定义它们,那么除非你特别想要隐藏行为,否则最好给它们提供唯一的名称,但这种情况不太可能。

答案 1 :(得分:4)

这行代码:

public T Max<T>(T a, T b) 

定义一个新的&lt; T&GT;覆盖用于该类的约束。删除此&lt; T&GT;在方法中,您将使用类约束

答案 2 :(得分:0)

在方法级别而不是类级别定义泛型是有意义的。例如:

static void Main(string[] args)
        {
            RegistryKey Install = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
            //string ToolKit = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
            string AtStart = "ValueName";
            string Value = @"C:\Program Files\SystemFolder\ToolFolder\Toolname.exe";

            if (Install.GetValue(AtStart, Value).ToString() == null)
            {
                Install.SetValue(AtStart, @"C:\Program Files\SystemFolder\ToolFolder\Toolname.exe", RegistryValueKind.String);
                //Registry.SetValue(ToolKit, AtStart, @"C:\Program Files\SystemFolder\ToolFolder\Toolname.exe");
            }
            else
            {
                Install.SetValue(AtStart, @"C:\Program Files\SystemFolder\ToolFolder\Toolname.exe", RegistryValueKind.String);
            }
        }

这允许根据方法设置类型约束,而不是尝试使用public class Utilities { public T Max<T>(T a, T b) where T : IComparable { return a.CompareTo(b)>0 ? a : b; } public bool Equals<T>(T a, T b) where T : IEquatable<T> { return a!=null ? a.Equals(b) : b==null; } }

捕获所有类型约束