【问题标题】:Of which elements does Generics allow parameterization by type?泛型允许按类型参数化哪些元素?
【发布时间】:2015-04-28 21:39:00
【问题描述】:

这是来自一些测试的问题。问题是“泛型允许按类型参数化哪些元素?” 和5种答案:

  1. 结构
  2. 方法
  3. 活动
  4. 字段

乍一看问题很简单,但我不确定正确答案。让我们一步一步来。

  1. 类。

我们可以这样写

class SuperKeyType<K, V, U>
    where U : System.IComparable<U>
    where V : new()
{ }

所以,类可以按类型参数化。结构体也是如此。

关于方法。我们可以这样写:

class GenericList<T>
{
    // CS0693 
    void SampleMethod<T>() { }
}

所以,方法也是。

关于事件和字段:

class Foo<TValue> {
    public string Value { get; set; }
    public TValue TypedValue {
        get {
            return (TValue)Convert.ChangeType(Value, tyepof(TValue));
        }
    }
}

属性是按类型参数化的,对吗(与事件相同)?但是在下一页

Making a generic property

我看到以下答案:

属性、事件、构造函数等不能是通用的——只有方法 并且类型可以是通用的。大多数时候这不是问题,但我 同意有时这是一种痛苦。布兰农的回答给出了两个 合理的解决方法。

我在这个地方问自己 - “按类型参数化”到底意味着什么?上面的属性是否按类型参数化? 什么是正确答案:

  1. 是的
  2. 是的
  3. 是的

  1. 是的
  2. 是的
  3. 是的
  4. 是的
  5. 是的

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    属性按类型参数化,正确(与事件相同)?

    不,不是。属性本身没有类型参数 - 您在 class 中获得了它。

    将其与您的方法示例进行比较:

    class GenericList<T>
    {
        // CS0693 
        void SampleMethod<T>() { }
    }
    

    ...这样会更清楚

    class NonGenericType
    {
        void GenericMethod<T>() { }
    }
    

    注意类型参数(T)是如何在方法签名中引入的,不是在类中的。

    您不能为字段、属性、事件、构造函数或终结器指定类型参数。

    通用属性必须类似于:

    // Not valid: properties can't be generic. But imagine...    
    public T Value<T> { get; set; }
    

    同样,泛型构造函数会是这样的:

    public class Foo
    {
        // Not valid: constructors can't be generic. But imagine...
        public Foo<T>(T initializationValue)
        {
            // Note that this isn't constructing a Foo<T> -
            // Foo is a non-generic type. It's only the constructor
            // that is generic.
        }
    }
    

    泛型字段作为一个概念更加奇怪。这可能意味着什么?

    private int field<T>;
    ...
    int x = field<string>;
    

    【讨论】:

      【解决方案2】:

      类、结构和方法。您使用参数化类型作为属性类型这一事实并不意味着属性本身是参数化的。其类型的类是。

      【讨论】:

        猜你喜欢
        • 2015-03-29
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 2017-12-26
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 2013-06-21
        相关资源
        最近更新 更多