菜鸟教程小白 发表于 2022-12-13 04:44:47

c# - 不能在 NSSet<TKey> 中使用类


                                            <p><p>我正在尝试为 Xamarin 的 iOS 框架创建绑定(bind),但它在某些 NSSet 属性的泛型类型上遇到了困难:</p>

<pre><code>// @interface Foo : NSObject

interface Foo
{ ... }

// @interface Bar : NSObject

interface Bar
{
    // @property (readonly, nonatomic) NSSet&lt;Foo *&gt; * _Nonnull foos;
   
    NSSet&lt;Foo&gt; foos { get; }
}
</code></pre>

<p>产生错误</p>

<blockquote>
<p>Error CS0311: The type &#39;Namespace.Foo&#39; cannot be used as type parameter &#39;TKey&#39; in the generic type or method &#39;NSSet&#39;. There is no implicit reference conversion from &#39;Namespace.Foo&#39; to &#39;ObjCRuntime.INativeObject&#39;.</p>
</blockquote>

<p>我不明白错误是因为<code>Foo</code>类是基于NSObject的,为什么会产生这个错误?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><a href="https://developer.xamarin.com/api/type/Foundation.NSSet%3CTKey%3E/" rel="noreferrer noopener nofollow"> <code>Foundation.NSSet&lt;TKey&gt; Class</code> </a>声明为</p>

<pre><code>
public sealed class NSSet&lt;TKey&gt; : NSSet, IEnumerable&lt;TKey&gt;
    where TKey : class, INativeObject
</code></pre>

<p>即,您的混凝土 <code>TKey</code>必须实现 <code>INativeObject</code> . <code>Foo</code>才不是。如果你改变 <code>Foo</code>到</p>

<pre><code>interface Foo : INativeObject
{ }
</code></pre>

<p>...编译器错误消失。</p>

<hr/>

<p> <code>where TKey : class, INativeObject</code>是 <a href="https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters" rel="noreferrer noopener nofollow">(generic) Type Parameter Constraint</a> .它告诉您 <code>TKey</code> 的类型参数必须是通过 <code>class</code> 的引用类型关键字并且它必须实现接口(interface) <code>INativeObject</code> .</p></p>
                                   
                                                <p style="font-size: 20px;">关于c# - 不能在 NSSet&lt;TKey&gt; 中使用类,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/52666538/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/52666538/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: c# - 不能在 NSSet&lt;TKey&gt; 中使用类