【发布时间】:2017-06-29 16:07:46
【问题描述】:
好的。我会简短。为什么这不起作用?
//Find<T> returns the T object with a given name
//Not a true method, but that's simplier for the example.
Warrior conan = Find<Warrior> ("Conan");
//Debug.Log is just printing the results
Debug.Log (conan is Warrior); //True
Debug.Log (conan is Character); //True, Warrior extends Character
Character other = Find<Character> ("Conan"); // Null, Why ?
我猜想通用 c# 方法在 IL 中是完全不同的,这就是为什么它不起作用。但这很烦人。我做错什么了吗?有没有办法绕过这个?
编辑:
其实我的方法有点不同。我正在使用MVC,我想找到与模型对应的视图。
public ElementView<E> Find<E> (E model) {
ElementView<E>[] tab = gameBoardView.transform.GetComponentsInChildren<ElementView<E>> ();
foreach (ElementView<E> el in tab)
if (EqualityComparer<E>.Default.Equals(el.model, model))
return el;
return null;
}
我是这样使用它的:
ElementView<Warrior> w = Find<Warrior> (myCharacter); // good if my character is a warrior
ElementView<Character> c = Find<Character> (myCharacter); // null
【问题讨论】:
-
添加 Find
的代码会有所帮助。 -
请显示
Find方法的来源。 -
我敢打赌 conan.getType() == "Warrior" 和 Find
打破了这一点。看起来 Find 需要使用相同的 is检查您的代码在此处执行的操作 -
你知道什么是协变和逆变吗?如果没有,请先学习。关键的见解是:一碗苹果不能当一碗水果:你可以把一根香蕉放在一碗水果里,但不能放在一碗苹果里。一碗水果不能当成一碗苹果,因为你可以从一碗水果中取出一根香蕉,但不能从一碗苹果中取出。因此,碗既不逆变也不协变。在 C# 中,接口和委托可能是协变或逆变的,但类和结构从不是。
-
@F.Morival:阅读我的评论。如果您了解协变和逆变,那么您将知道问题的答案。借此机会了解一下,因为这是您问题的症结所在。
标签: c# generics inheritance interface