English 中文(简体)
有可能将通用的参数限制在Sting OR Array。
原标题:Is it possible to constrain a generic type parameter to String OR Array

简言之,是否可以界定一个一般方法,在哪类参数(T受限制时,限制在stringint[]? 在福多-C#,我想做的是:

public static int MyMethod<T> ( T arg1, T arg2 ) 
    where T : (has an indexer that returns an int) {
    // stuff with arg1[i], arg2[j], etc...
}

请注意,在C#中,由于载于<条码>>>的索引er(该代码填入<>条码><>>>,加上从<条码/代码>到<条码>的默示转换,以下表述确切是指<条码><>>>/条码>是<条码>、>条码>或<条码>的同义词:

int someval = source[index];

Per the thread Constrain general extension methods to base categories and string 我认识到,我只能把没有关联的类型列入<代码>,其中T:x...... 限制条款。 http://europa-eu-un.org 遵守<代码>T: IEvidable<int>,但IE amountable<T>并不要求实施者拥有索引,这正是我使用两种类型共同特征。

其宗旨是,我建造一些高度优化的缝.和分析功能,如快速执行达马瑙-洛文辛远程算法。 我发现,首先把我方言转换成形形形形色色体,有时会以重复性逐个处理方式(如D-L算法)加快处决速度。 这主要是因为比较<代码>int的数值比照char/code>的数值要快得多。

有时执行字。 有时会更快地直接在座标上操作,避免第一次转换和复制到<代码>int阵列的费用。 因此,除声明外,我现在有真正相同的方法。

当然,我可以使用<代码>dynamic,但从操作时间检查来看的履约惩罚完全摧毁了在建筑方法上取得的任何收益。 (I <>did>/strong> 测试。)

最佳回答

你们不可能有“哪一类人必须有一个指数”。

然而,你可能会有一种制约因素,即“这种类型必须实施具有索引员的接口”。 例如,这种接口可以是IList<char>

遗憾的是,stringn't implementing IList<char>,因此,你必须为其写一个小的包装类别:

sealed class StringWrapper : IList<char>
{
    public string String { get; private set; }
    public StringWrapper(string str) { String = str; }
    public static implicit operator StringWrapper(string str)
    {
        return new StringWrapper(str);
    }

    public char this[int index]
    {
        get { return String[index]; }
        set { throw new NotSupportedException(); }
    }

    // Etc.... need to implement all the IList<char> methods
    // (just throw NotSupportedException except in the ones that are trivial)
}

那么,你可以宣布这样的方法:

public static TElement MyMethod<TCollection, TElement>(TCollection arg)
    where TCollection : IList<TElement>
{
    return arg[0];
}

[...]

MyMethod<StringWrapper, char>("abc")     // returns  a 
MyMethod<int[], int>(new[] { 1, 2, 3 })  // returns 1
问题回答

无,C#不允许你制造“复合”限制。

你的表述的确意味着同样的事情,但你可以利用这一事实来谋取好处。 C# generals 类似于C++模板,但完全不同,因此索引员同样做的事情不再重要。

当然,你只能用你需要的具体类型制造两台超载荷,但这确实意味着一些涂料和复制件;过去。 任何旨在避免重复的抽象做法都会使你的工作受到严重影响。

您可以签名

public static int MyMethod<T> ( T[] arg1, T[] arg2 )

并使用强项。 ToCharArray()在提出论据之前(或可能是在超负荷工作时),请见......





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签