【问题标题】:Template function in C# - Return Type?C# 中的模板函数 - 返回类型?
【发布时间】:2011-03-04 04:57:55
【问题描述】:

看来c#不支持c++之类的模板。例如

template <class myType>
myType GetMax (myType a, myType b) {
 return (a>b?a:b);
}

我希望我的函数具有基于其参数的返回类型,我如何在 c# 中实现这一点?如何在 C# 中使用模板

编辑:我可以将 object 和 getType 用于几乎相同的目的吗?

【问题讨论】:

  • 我不明白你会如何使用 GetType 来完成同样的事情,不。而且您不希望 API 返回对象,除非您很高兴调用者必须在整个地方进行强制转换。

标签: c# templates function-templates


【解决方案1】:

你的意思是这样的

   public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
   {
       if (source == null) return null;
       return source.Select(selector);
   }

【讨论】:

    【解决方案2】:

    你会想看看generics。语法:

    public T GetMax<T>(T a, T b) {
        return (a>b?a:b);
    }
    

    UPDATE 因为一些 cmets... 我只是想提供一个非常快速的概述。是的,我猜它不能正确编译或执行。但这是关于它的外观的基本想法。同时,您会发现关于此主题的更完整的回复。

    执行语法:

    int a = 5;
    int b = 10;
    int result = GetMax(a, b);
    

    希望这会有所帮助,

    问候, 托马斯

    【讨论】:

    • 我正要说同样的话,但由于'return (a>b?a:b);'这行代码无法编译他需要一个接口约束什么的……
    • 您不能以这种方式比较 a 和 b,因为编译器不知道 T 是什么。如果类型 T 不支持比较怎么办?
    【解决方案3】:

    C# 中的泛型不如 C++ 中的模板强大。你想做的事情在 C# 中不起作用。

    针对您的情况的破解/解决方法是

    public T GetMax<T>(T a, T b) where T: IComparable {
        if(a.CompareTo(b) > 0) {
            return a;
        }
        return b;
    }
    

    【讨论】:

    • 我给出的函数只是一个示例,除了比较之外的函数呢?
    • @LifeH2O:这取决于 - 它是否在界面中指定?如果是这样,您可以约束泛型类型以实现接口(或从给定的基类派生等)。
    • 作为一名 C++ 开发人员,您可能会发现自己对 C# 的泛型感到失望。但它们在许多场景中仍然有用,值得学习。
    【解决方案4】:

    你的代码会变成这样:

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

    【讨论】:

      【解决方案5】:

      在 C# 中最接近 C++ 模板的是泛型 - 但它们并不是非常接近。特别是,您不能在泛型类型值之间使用像 &gt; 这样的运算符,因为编译器不知道它们(并且您不能基于运算符来约束类型)。另一方面,你可以写:

      public T GetMax<T>(T lhs, T rhs)
      {
          return Comparer<T>.Default.Compare(lhs, rhs) > 0 ? lhs : rhs;
      }
      

      public T GetMax<T>(T lhs, T rhs) where T : IComparable<T>
      {
          return lhs.CompareTo(rhs) > 0 ? lhs : rhs;
      }
      

      请注意,第一个是空安全的;第二个不是。

      泛型的完整描述远远超出了 Stack Overflow 答案的范围; MSDN 有一些资料,或查阅你最喜欢的 C# 书籍。

      【讨论】:

      • 我听说 C# 深入地对泛型有一些很好的解释 :)
      • 我给出的函数只是一个示例,除了比较之外的函数呢?
      • @Life2HO:嗯,你想要什么功能?它是在接口中指定的实例方法吗?如果是这样,你很好。
      【解决方案6】:

      泛型!

      class MyClass<T> where T : IEnumerable (any parent class here!)
      {
         T myGeneric {get; set;}
      }
      

      【讨论】:

        【解决方案7】:

        您在 C# 中使用泛型来获得类似模板的功能。

        http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

        public class MyType<T>
        {
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-20
          • 2018-04-06
          • 2012-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多