相关疑难解决方法(0)

C#泛型:如果T是返回类型,它也可以是无效的吗?如何将这些接口组合在一起?

我有以下接口,使用回调返回类型T的泛型参数...

public interface IDoWork<T>
{
    T DoWork();
}
Run Code Online (Sandbox Code Playgroud)

但是我也有以下接口,但它不会调用回调,因为它返回void.

public interface IDoWork
{
    void DoWork();
}
Run Code Online (Sandbox Code Playgroud)

我可以组合这两个接口并使用运行时逻辑来确定差异吗?我怎样才能做到这一点?

c# generics api api-design nul

22
推荐指数
1
解决办法
5536
查看次数

为什么我不能有一个类型的对象约束

我正在尝试设置自定义IDictionary,它将允许Object作为我的TValue.

这是它的样子:

public class NullTolerantDictionary<TKey, TValue> 
             : Dictionary<TKey, TValue> where TValue : class
{
    public TValue this[TKey key]
    {
        get
        {
            TValue value;
            if (TryGetValue(key, out value))
            {
                return value;
            }
            else
            {
                return DependencyProperty.UnsetValue;
            }
        }        
    }
}
Run Code Online (Sandbox Code Playgroud)

当编译它时说:

无法将类型'object'隐式转换为'TValue'.

所以为了解决这个问题,我将类型约束更改为:

where TValue : object
Run Code Online (Sandbox Code Playgroud)

(object而不是上课)

然后我收到这条消息:

约束不能是特殊类'对象'

我该如何解决这个问题?

用于解释为什么object不能成为约束的额外功劳.

.net c# generics

5
推荐指数
2
解决办法
1442
查看次数

Unity 开发人员如何限制从 Object 派生的泛型类型参数?

Unity 开发人员如何限制从 Object 派生的泛型类型参数?

在寻找问题的答案时,我遇到了这个问题。有答案说明以下内容:

这两个约束之间没有区别,除了一个是不允许明确声明的。

证明应该不可能约束对象。在 Unity 中,我们可以看到以下方法:

public static T Instantiate<T>(T original, Vector3 position, Quaternion rotation) where T : Object;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这是因为 Unity 使用的是 Mono 而不是 CLR 吗?

c# generics constraints unity-game-engine

4
推荐指数
1
解决办法
164
查看次数

标签 统计

c# ×3

generics ×3

.net ×1

api ×1

api-design ×1

constraints ×1

nul ×1

unity-game-engine ×1