Flexbox может сделать это.
.card {
display:flex;
flex-direction:column;
}
.button {
margin-top:auto;
}
.card {
width:33%;
margin:auto;
display: flex;
flex-direction: column;
height:90vh;
border:1px solid red;
}
.button {
margin-top: auto;
}
<div class="card">
<h2>Title</h2>
<h3>Name</h3>
<p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Molestiae, voluptatum?</p>
<button class="button">button</button>
</div>
Если Вы реализуете IEnumerable<T>
универсальный интерфейс, необходимо будет в значительной степени всегда использовать универсальный метод GetEnumerator - если Вы не бросаете свой объект явно к (неуниверсальному) IEnumerable.
Причиной является назад совместимость с.NET 1.0/1.1, который не поддерживал дженериков.
Причиной там являются два метода, то, потому что IEnumerable<T>
наследовался IEnumerable
взаимодействуйте через интерфейс, таким образом, Вы видите общий метод от IEnumerable<T>
и необщий метод от IEnumerable
.
Вот то, как Вы хотите реализовать интерфейс в своем типе:
class Foo : IEnumerable<Foo>
{
public IEnumerator<Foo> GetEnumerator()
{
// do your thing here
}
// do a EIMI here and simply call the generic method
IEnumerator IEnumerable.GetEnumerator()
{
this.GetEnumerator();
}
}
Вы обычно реализуете обоих. Каждый - более новая, универсальная версия, которая возвращает безопасный с точки зрения типов перечислитель (IEnumerator<T>
). Другой - для совместимости с Унаследованным кодом (возвраты IEnumerator
). Типичная реализация:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
Обычно GetEnumerator()
вызовы GetEnumerator<T>()
, таким образом, не должно быть большого различия в поведении. Что касается того, почему существует два метода, это сделано для назад совместимости и для использования в ситуации где T
не очень интересно (или просто неизвестно).
Тот универсален, другой один нет. Я полагаю, что компилятор предпочитает использовать универсальную перегрузку.